Переименование имен отдельных файлов при копировании всей папки с помощью copyTpl

Мой генератор yoman копирует файлы из шаблона в путь назначения:

this.fs.copyTpl(
            this.templatePath(),
            this.destinationPath(), {
                appName: this.props.appName
            });

Во время создания проекта мне нужно присвоить значение this.props.appName некоторым именам файлов.

К сожалению, я не могу сделать это так, как я мог бы сделать внутри этих файлов:

<%=appName%>-project.sln

Все файлы, которые необходимо переименовать, имеют appTemplate в своих именах, поэтому мне нужно просто заменить appTemplate значением this.props.appName.

Могу ли я как-то настроить copyTpl для переименования некоторых файлов при их копировании в другое место?


person Piotrek    schedule 31.08.2016    source источник
comment
Возможный дубликат Скопируйте все файлы, но измените имя некоторых автоматически в йомен   -  person Simon Boudrias    schedule 31.08.2016


Ответы (3)


Хорошо, я нашел решение. Согласно документам yoman:

Любой автор генератора может зарегистрировать transformStream для изменения пути к файлу и/или содержимого.

Используя этот метод:

this.registerTransformStream();

Это означает, что я могу передать все сгенерированные файлы через некоторый скрипт:

var rename = require("gulp-rename");
//other dependecies...

module.exports = yeoman.Base.extend({

    //some other things generator do...

    writing: function() {
        var THAT = this;
        this.registerTransformStream(rename(function(path) {
            path.basename = path.basename.replace(/(666replacethat666)/g, THAT.props.appName);
            path.dirname = path.dirname.replace(/(666replacethat666)/g, THAT.props.appName);
        }));
        this.fs.copyTpl(
            this.templatePath(),
            this.destinationPath(), {
                appName: this.props.appName
            });
    }
});

Этот сценарий будет передавать все файлы через gulp-rename, изменяя 666replacethat666 на что-то более разумное.

person Piotrek    schedule 01.09.2016
comment
Великолепно, в конце концов, ЭТО не использовалось, просто доступ к реквизиту напрямую. - person Darius; 09.01.2017
comment
lastest gulp-rename у меня не работал, а только версия 1.2.2. - получил подсказку отсюда: github.com/yeoman/yo/issues/577 #issuecomment-392325341 - person Ivan Marinov; 03.06.2019

Если вы не можете использовать registerTransformStream, потому что вы используете функцию composeWith() в Yeoman (которая отключает регистрацию потоков преобразования), вы можете использовать processDestinationPath, которая работает при выборе нескольких файлов (не когда вы указываете конкретный файл в первом аргументе, для некоторых причина).

this.fs.copyTpl(
  this.templatePath("**/{.*,*}"),
  this.destinationPath(),
  { /* usually your prompt answers are here */ },
  {},
  {
    processDestinationPath: (filePath: string) =>
      filePath.replace(/somedir\/a-file.js/g, 'newdir/better-filename.js'),
  },
);

От источника к вариантам документации: https://yeoman.github.io/generator/actions_fs.html#.copyTemplate

Который основан на https://github.com/SBoudrias/mem-fs-editor#copyfrom-to-options-context-templateoptions-

person William Bernting    schedule 25.03.2021
comment
Это правильный ответ в 2021 году. - person McMath; 03.07.2021

registerTransformStream с gulp-rename по-прежнему проблема. Тем не менее, я работаю с glob.

const glob = require('glob');

writing() {
    const files = glob.sync('**', { dot: true, nodir: true, cwd: this.templatePath() })
    for (let i in files) {
        this.fs.copyTpl(
            this.templatePath(files[i]),
            this.destinationPath( this.props.destinationFolderPath + '\\' + files[i].replace(/__fileName__/g,this.props.fileName)),
            this.props
        )
    }
}
person Krunal Jariwala    schedule 12.11.2019