我有以下结构:
src/
modules/
module1/
js/
main.js
scss/
main.scss
index.html
module2/
js/
main.js
scss/
main.scss
index.html
我想执行一项艰巨的任务,将这些任务复制到以下结构中:
dev/
js/
module1.js
module2.js
css/
module1.css
module2.css
module1.html
module2.html
有没有办法用现有的grunt插件执行此操作?如果没有,我怎么能实现这个目标?
答案 0 :(得分:85)
可以使用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']);
};
答案 1 :(得分:5)
此处不再需要使用grunt-contrib-copy
,您现在可以利用grunt.file.expandMapping
,它可以选择仅更改文件扩展名,或者定义一个函数返回输出文件名。
以下是files
任务中jade
对象的示例,用于将.jade模板编译为.html文件:
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 docs中ext
和rename
(以及其他)选项的详细信息。更多示例here和here。
答案 2 :(得分:2)
您可以简单地使用以下选项: 展开:true, flatten:true
无需自定义重命名回调。
答案 3 :(得分:0)
不完全是您的问题的答案,但我在这里寻找相对目标文件夹与grunt 所以...这就是我如何解决它
...
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);
只是创造了我需要的路径。
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电子邮件
答案 4 :(得分:0)
我想将文件保存在我们找到文件的根目录下创建的 min 文件夹中,这样可以更轻松地将插件文件夹移动到另一个项目中:
-- Plugins/
-- bootstrap/
-- bootstrap.js
-- bootstrap.css
-- min/
-- bootstrap.min.js
-- bootstrap.min.css
我在此页面上发布了我找到的解决方案,也许它可以帮助其他人:
uglify: {
options: {
mangle: true
},
dynamic_mappings: {
// Grunt will search for "**/*.js" under "Plugins/" when the "uglify" task
// runs and build the appropriate src-dest file mappings then, so you
// don't need to update the Gruntfile when files are added or removed.
files: [
{
expand: true, // Enable dynamic expansion.
cwd: 'Plugins/', // Src matches are relative to this path.
src: ['**/*.js', '!**/*.min.js'], // Pattern to match (ignore .min files)
dest: '/min/', // Destination path prefix.
ext: '.min.js', // Dest filepaths will have this extension.
extDot: 'last', // Extensions in filenames begin after the first dot
rename: function( dest, matchedPath, options ) {
Pathname = matchedPath.substring( 0, matchedPath.indexOf('/') );
Filename = matchedPath.replace( Pathname, '' );
//Return "Plugins / plugin_folder / min / file_name.min.js"
return options.cwd + Pathname + dest + Filename;
}
},
],
},
}
答案 5 :(得分:-1)
如果您想将.coffee文件重命名为.js或类似名称,则只需对其进行修改即可;)
sudo npm install grunt-contrib-copy
copy: {
rename: {
files: [{
expand: true,
dot: true,
cwd: './app/scripts',
dest: './app/scripts/',
src: [
'**/*.coffee'
],
rename: function(dest, src) {
console.log(dest + src);
return dest + src.replace('.coffee','.js');
}
}]
}
},