如何根据相应文件的父文件夹名称使用 Grunt 重命名文件?
Posted
技术标签:
【中文标题】如何根据相应文件的父文件夹名称使用 Grunt 重命名文件?【英文标题】:How can I rename files with Grunt, based on the respective file's parent folder name? 【发布时间】:2013-02-22 15:32:05 【问题描述】:我有以下结构:
src/
modules/
module1/
js/
main.js
scss/
main.scss
index.html
module2/
js/
main.js
scss/
main.scss
index.html
我想运行一个 grunt 任务将这些复制到以下结构中:
dev/
js/
module1.js
module2.js
css/
module1.css
module2.css
module1.html
module2.html
有没有办法使用现有的 grunt 插件来做到这一点?如果没有,我怎么能做到这一点?
【问题讨论】:
【参考方案1】:我想将文件保存在我们找到该文件的根目录中创建的 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;
,
],
,
【讨论】:
【参考方案2】:如果您想将 .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');
]
,
【讨论】:
【参考方案3】:不完全是您问题的答案,但我在这里寻找 带有 grunt 的相对 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);
只是创建了我需要的路径。
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】:不再需要为此使用grunt-contrib-copy
,您现在可以利用grunt.file.expandMapping
,它具有仅更改文件扩展名或定义返回输出文件名的函数的选项。
下面是 jade
任务中的 files
对象示例,用于将 .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。
【讨论】:
【参考方案5】:您可以简单地使用以下选项: 展开:真的, 展平:真
无需自定义重命名回调。
【讨论】:
【参考方案6】:这可以使用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']);
;
【讨论】:
遇到相反的情况:需要将文件从一个来源移动到不同的文件夹。您的回答解决了我的问题,谢谢! 这里还有很重要的一点要注意的是,如果你想在重命名的时候跳过某些文件,正确的返回值(默认)是return dest+'/'+src
——这会导致文件被复制到默认位置。
那么,只是做一个简单的命令行操作,比如复制文件,就必须安装插件吗?基本上每个操作都需要安装插件吗?
@Jakobud 不,您可以使用内置的 Node.js 方法进行文件处理,请参阅 nodejs.org/api/fs.html 尽管它们只是低级
@Malki 我相信重命名功能实际上是 grunt 本身的一个特性(而不是特定于 grunt-contrib-copy)。我用 grunt@0.4.5 和 grunt-contrib-copy@0.7.0 进行了测试,但仍然会为我调用重命名函数。 Here 是 grunt 中运行重命名函数的代码。让我知道是否有一种简单的方法可以重现您遇到的问题!以上是关于如何根据相应文件的父文件夹名称使用 Grunt 重命名文件?的主要内容,如果未能解决你的问题,请参考以下文章
在 Maven 中 - 如何根据正在使用的配置文件的名称重命名输出 .war 文件
使用 grunt 服务器,如何将所有请求重定向到根 url?