Подождите, пока this.fs.copyTpl завершится на Yeoman Generator - PullRequest
0 голосов
/ 03 октября 2018

В моем Yeoman Generator есть следующий код:

_appTemplate(src, dest, addToHG, scope) {
  let done = this.async();
  if (src === null || dest === null) {
    return;
  }

  let fullPathSrc = this.templatePath(src);
  let fullPathDest = this.destinationPath(path.join('src', dest));
  this.fs.copyTpl(fullPathSrc, fullPathDest, scope);

  if (addToHG) {
    this.log('Adding:' + fullPathDest + ' to HG now...');
    this.spawnCommand('hg', ['add', fullPathDest]).on('close', done);
  } else {
    done();
  }
}

Но я вижу, что попытка добавить файл в HG (mercurial) происходит слишком рано, файлы не существуют.Как мне дождаться завершения copyTpl?

Я попробовал следующее, но ни одно из них на самом деле не сработало:

this.fs.copyTpl(fullPathSrc, fullPathDest, scope).then(() => {});

И

this.fs.copyTpl(fullPathSrc, fullPathDest, scope).on('end', () => {});

Но другие шаблоны, кажется,поддерживается, и я не могу найти актуальную документацию для this.fs.copyTpl ().

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Я работаю над чем-то связанным.

У меня недостаточно репутации, чтобы писать комментарии.Поэтому я пишу ответ, который совсем не является ответом:

Если я использую this.fs.commit, все будет зафиксировано, и пользователю не будет предложено перезаписать файл или нет.Причина использования mem-fs-editor заключается в том, что мы хотим предложить пользователю вопрос о том, перезаписывать или нет.

Вы нашли другой способ?Я продолжил поиск, но пока не нашел решения:

mem-fs-editor работает поверх mem-fs.Хранилище mem-fs наследуется от EventEmitter и генерирует событие change.См. SBoudrias / mem-fs / blob / master / index.js

// ...

// line 28
var Store = function () {
    events.EventEmitter.apply(this, arguments);
};
util.inherits(Store, events.EventEmitter);

// ...

// Line 38
Store.prototype.add = function (file) {
    store[file.path] = file;
    this.emit('change');
    return this;
};


// ...

Может быть полезным событие change.Но, к сожалению, никакие аргументы не передаются функциям слушателя.Поэтому мы не знаем, что изменилось.

this.fs.store.on( 'change', () => {
    console.log( 'Something has changed. But who knows what?' );    
} );

Чтобы увидеть все файлы в хранилище: this.fs.store.each( file => console.log( file ) );.

Возможно, можно добавить функцию прослушивателя, запустите this.fs.copyTplи снова удалите слушателя.

Надеюсь, что это может кому-то помочь.

0 голосов
/ 03 октября 2018

Конечно, через несколько минут после публикации моего вопроса я нахожу документацию для this.fs.copyTpl ().Оказывается, это пакет файловой системы «в памяти», и он не записывает файлы на диск до более поздней версии.

https://github.com/SBoudrias/mem-fs-editor#copyfrom-to-options

Вот решение, которое работает, но я не знаю, еслиэто идеально.Я открыт для предложений здесь.

_appTemplate(src, dest, addToHG, scope) {
  let done = this.async();
  if (src === null || dest === null) {
    return;
  }

  let fullPathSrc = this.templatePath(src);
  let fullPathDest = this.destinationPath(path.join('src', dest));

  this.fs.copyTpl(fullPathSrc, fullPathDest, scope);
  this.fs.commit([], () => {
    if (addToHG) {
      this.log('Adding:' + fullPathDest + ' to HG now...');
      this.spawnCommand('hg', ['add', fullPathDest]).on('close', done);
    } else {
      done();
    }
  });
}
...