2017-07-04 2 views
0

私はJakefileを使ってWordpressのページをコマンドラインから更新しています。私はファイルを編集する時間を再構築するためにJakeの監視タスクを使用しています。私はVimの持つファイルを編集するときは、最初のビルドが成功した後、ジェイクは、次のエラーで失敗します。VimでJakeJS watchの動作を確実にするにはどうしたらいいですか?

WatchTask started for: default 
cp home.html dist/home.html 
exec wp --path=../wordpress post list --post_type=page --format=json --fields=ID,post_name { silent: true } 
exec wp --path=../wordpress post update 2 dist/home.html --post_type=page 
Success: Updated post 2. 
jake aborted. 
Error: File-task home.html has no existing file, and no action to create one. 
    at FileBase.isNeeded (/usr/local/lib/node_modules/jake/lib/task/file_task.js:50:17) 
    at TaskBase.run (/usr/local/lib/node_modules/jake/lib/task/task.js:256:26) 
(See full trace by running task with --trace) 

私は再構築を遅らせるために、ルールにスリープ機能を使用してみました。 Vimはファイルを保存するときに、その内容を新しい一時ファイルに書き込んだ後、新しい一時ファイルの名前を元のファイル名に変更するため、これを試しました。ファイルが完全に名前変更される前にビルドしようとしているため、ビルドに失敗したと思います。スリープを使用すると確実に動作しないため、1回または2回動作する可能性がありますが、上記と同じ方法で失敗します。ここで

は私Jakefileです:

var shell = require('shelljs'); 
var sleep = require('sleep'); 

shell.config.verbose = true; 

const destDir = 'dist'; 
const wpDir = '../wordpress'; 


var files = new jake.FileList(); 
files.include('*.html'); 
var outputFiles = files.toArray().map(function(fileName){ 
        return destDir + '/' + fileName; 
}); 

var sourceFile = function(name) { 
    return name.substr(name.lastIndexOf('/') + 1); 
} 
function objectToStr(object) { 
    var s = ''; 
    for(var property in object){ 
     s += property + ': ' + object[property] + '\n'; 
    } 
    return s; 
} 
function rmExt(name) { 
    return name.substr(0, name.lastIndexOf('.')); 
} 

directory(destDir); 
task('default', [destDir].concat(outputFiles)); 
task('clean', function() { 
    jake.rmRf(destDir); 
}); 
rule('dist/%.html', sourceFile, function() { 
    shell.cp(this.source, this.name); 
    var pages = JSON.parse(shell.exec('wp --path=' + wpDir 
        + ' post list --post_type=page --format=json --fields=ID,post_name', 
        { silent: true }).stdout); 
    var postId = null; 
    var l = pages.length; 
    for(var i = 0; i < l; i++){ 
     if(pages[i].post_name === rmExt(this.source)){ 
      postId = pages[i].ID; 
      break; 
     } 
    } 
    if(postId !== null){ 
     shell.exec('wp --path=' + wpDir + ' post update ' + postId 
        + ' ' + this.name + ' --post_type=page'); 
    }else{ 
     shell.echo('Unable to find matching post ID for file: ' + this.name); 
    } 
    shell.echo('1'); 
    sleep.sleep(2); 
    shell.echo('2'); 
}); 
watchTask('watch', ['default'], function() { 
    this.watchFiles.include('*.html'); 
} 
+0

ほとんどのファイルウォッチャーは、イベントを集約することができ、Vimが実際にファイルを書き込んだ後にのみアクションを実行することができます。 [Jake's watcher](https://github.com/jakejs/jake/blob/master/lib/watch_task.js)はとても素朴なようですので、適切な選択肢を検討することをお勧めします。 – romainl

+0

ありがとうございます@romainl。私は 'inotifywait'を使って調べましたが、単一のファイルを見るときに同じ問題が発生しました。私はStackExchangeに関するいくつかのガイダンスを[vimと共にinotifywaitを使う](https://unix.stackexchange.com/questions/188873/using-inotifywait-along-with-vim)で見つけました。代わりにディレクトリを見てみることをお勧めします。それは解決策の策定に役立っています。 –

+0

[modd](https://github.com/cortesi/modd)または[entr](http://entrproject.org/)を試してください。 – romainl

答えて

0

私は図書館node-watchを使用して信頼性の高いソリューションを見つけました。私はwatchTaskを通常のJakeタスクに置き換え、node-watchを使って呼び出したいタスクを呼び出し、現在の作業ディレクトリを見ました。ライブラリnode-watchはregexに基づいてファイルをフィルタリングすることができるので、時計はVimスワップファイルなどのためにトリガされません。以下は、私が使用したコードは次のとおりです。

task('watch', function() { 
    var defaultTask = jake.Task['default']; 

    defaultTask.invoke(); 
    defaultTask.reenable(true); 

    watch('./', { filter: /.*.html$/ }, function(evt, name) { 
     defaultTask.invoke(); 
     defaultTask.reenable(true); 
    }); 
}); 

注:また、私は時計のタスクは必ず時計が開始する前に行った変更が構築されているようにする最初に実行したときに呼び出さしたいタスクを呼び出しました。

関連する問題