如何根据相应文件的父文件夹名称使用Grunt重命名文件?

我有以下结构:

src/ modules/ module1/ js/ main.js scss/ main.scss index.html module2/ js/ main.js scss/ main.scss index.html 

我想运行一个咕task任务,将其复制到以下结构中:

 dev/ js/ module1.js module2.js css/ module1.css module2.css module1.html module2.html 

有没有办法做到这一点与现有的咕噜插件? 如果没有,我怎么能做到这一点?

这可以使用grunt-contrib-copy插件完成。

最重要的是要注意的是,你可以通过使用重命名函数(它接受每个文件的目的地和源代码)以编程方式改变目的地。

这里是一个(稍微脆弱的)样本Gruntfile.js应该复制到你想要的结构:

 module.exports = function(grunt) { // Project configuration. grunt.initConfig({ copy: { main: { files: [ { expand: true, cwd: 'src/modules/', src: ['**/*.js'], dest: 'dev/js/', rename: function(dest, src) { // use the source directory to create the file // example with your directory structure // dest = 'dev/js/' // src = 'module1/js/main.js' return dest + src.substring(0, src.indexOf('/')) + '.js'; } }, { expand: true, cwd: 'src/modules/', src: ['**/*.scss'], dest: 'dev/css/', rename: function(dest, src) { return dest + src.substring(0, src.indexOf('/')) + '.css'; } }, { expand: true, cwd: 'src/modules/', src: ['**/*.html'], dest: 'dev/', rename: function(dest, src) { return dest + src.substring(0, src.indexOf('/')) + '.html'; } } ] } } }); grunt.loadNpmTasks('grunt-contrib-copy'); // Default task(s). grunt.registerTask('default', ['copy']); }; 

现在不需要再使用grunt-contrib-copy了,现在可以利用grunt.file.expandMapping ,它可以select只更改文件扩展名,或者定义一个返回输出文件名的函数。

下面是一个用于将.jade模板编译为.html文件的jade任务中的files对象示例:

 files: [{ expand: true, src: "**/*.jade", dest: "<%= distDir %>", cwd: "<%= assetsDir %>/jade", rename: function(dest, matchedSrcPath, options) { // return the destination path and filename: return (dest + matchedSrcPath).replace('.jade', '.html'); } }] 

在这种情况下使用ext: '.html'选项而不是rename选项会更容易,但是我在这里使用rename ,以便您可以看到它是如何工作的。

有关grunt.file文档中的extrename (以及其他)选项的更多信息。 这里和这里还有更多的例子。

您可以简单地使用这些选项:expand:true,flatten:true

不需要自定义重命名callback。

不完全是你的问题的答案,但我在这里find与咕噜相对dest文件夹所以…这是我如何解决它

 ... base: { files: [ { expand: true, cwd: 'app/design/frontend/', src: ['**/Magento_Sales/email-src/*.html'], dest: '../../Magento_Sales/email/', rename: function(dest, src, expand) { src = path.parse(src) return path.join(expand.cwd, src.dir, dest, src.base); } }, ], } ... 

这一点path.join(expand.cwd, src.dir, dest, src.base); 只是创造我需要的path。

expand.cwd = app/design/frontend/

src.dir = <DYNAMIC_FOLDERS>/Magento_Sales/email-src/

dest = ../../Magento_Sales/email/

src.base = <FILE>.html

和所有它一起= app/design/frontend/<COMPANY>/<MAIN-THEME>/Magento_Sales/email/<FILE>.html

在我的情况下,现在将编译我的HTML电子邮件在相对目标文件夹