私は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');
}
ほとんどのファイルウォッチャーは、イベントを集約することができ、Vimが実際にファイルを書き込んだ後にのみアクションを実行することができます。 [Jake's watcher](https://github.com/jakejs/jake/blob/master/lib/watch_task.js)はとても素朴なようですので、適切な選択肢を検討することをお勧めします。 – romainl
ありがとうございます@romainl。私は 'inotifywait'を使って調べましたが、単一のファイルを見るときに同じ問題が発生しました。私はStackExchangeに関するいくつかのガイダンスを[vimと共にinotifywaitを使う](https://unix.stackexchange.com/questions/188873/using-inotifywait-along-with-vim)で見つけました。代わりにディレクトリを見てみることをお勧めします。それは解決策の策定に役立っています。 –
[modd](https://github.com/cortesi/modd)または[entr](http://entrproject.org/)を試してください。 – romainl