使用 gruntjs 自定义初始化任务重命名模板文件夹

rename templates folders with a gruntjs custom init task

本文关键字:文件夹 重命名 任务 gruntjs 自定义 初始化 使用      更新时间:2023-09-26

我正在尝试为 Grunt 中的个人模板创建自定义初始化任务

这是在grunt init:mytemplate后生成我的新项目的 js

exports.description = 'Try Grunt';
exports.warnOn = '*';
exports.template = function(grunt, init, done) {
  grunt.helper('prompt', {type: 'skin'}, [
    grunt.helper('prompt_for', 'name', 'trygrunt'),
    grunt.helper('prompt_for', 'title', 'Im Trying GruntJS'),
    grunt.helper('prompt_for', 'author_name', 'Myself')
  ],
  function(err, props) {
    var files = init.filesToCopy(props);
    init.copyAndProcess(files, props);
    done();
  });
};

一切正常:根据rename.json信息从自定义模板的root文件夹正确生成或重命名文件和文件夹。

问题是:如何动态重命名文件夹而不仅仅是文件?

{
    "libs/name.js": "libs/{%= name %}.js" //this works fine
    "src/name": "src/{%= name %}" //this doesn't work
}

init.filesToCopy 方法在首次生成 files 对象时仅查看特定文件(而不是目录)匹配项renames.json。最好的办法是以编程方式修改 init.filesToCopyinit.copyAndProcess 之间的 files 对象。

这可以通过修改 init.filesToCopy 对象的结果来实现。 但是,您需要修改键而不是每对的值。

例如,我有一个名为lib/的文件夹,我希望将内容复制到app/

var files = init.filesToCopy(props),
    libFolder = 'app';
// Repath the files correctly
for (var file in files) {
    if (file.indexOf('lib/') > -1) {
        var path = files[file],
            newFile = file.replace('lib/', libFolder + '/');
        files[newFile] = path;
        delete files[file];
    }
}
init.copyAndProcess(files, props);

还值得注意的是,rename.json 适用于 lib/值而不是新文件夹。

我所做的一件事是使用 props.main 值来提取 libFolder 值(例如 libFolder = props.main.split('/')[0])

实现此目的并绕过无法重命名文件夹的限制的另一种方法是 1) 设置一个 grunt-contrib-copy 任务来复制文件夹和文件并将您需要的任何名称应用于新文件夹/文件,然后 2) 让一个 grunt-contrib-clean 任务清理旧文件/文件夹,从而产生与重命名文件夹相同的净效果。