grunt配置
Grunt的task配置都是在 Gruntfile
中的grunt.initConfig
方法中指定的亚茬。此配置主要是以任務(wù)名稱命名的屬性,也可以包含其他任意數(shù)據(jù)铡恕。一旦這些代表任意數(shù)據(jù)的屬性與任務(wù)所需要的屬性相沖突,就將被忽略丢间。
此外探熔,由于這本身就是JavaScript,因此你不僅限于使用JSON烘挫;你可以在這里使用任何有效的JavaScript诀艰。必要的情況下,你甚至可以以編程的方式生成配置饮六。
grunt.initConfig({
concat: {
// 這里是concat任務(wù)的配置信息其垄。
},
uglify: {
// 這里是uglify任務(wù)的配置信息
},
// 任意數(shù)據(jù)。
my_property: 'whatever',
my_src_files: ['foo/*.js', 'bar/*.js'],
});
任務(wù)配置和目標(biāo)
當(dāng)運(yùn)行一個任務(wù)時卤橄,Grunt
會自動查找配置對象中的同名屬性绿满。多任務(wù)(multi-task)可以通過任意命名的“目標(biāo)(target)”來定義多個配置。在下面的案例中窟扑,concat
任務(wù)有名為foo和bar兩個目標(biāo)喇颁,而uglify
任務(wù)僅僅只有一個名為bar
目標(biāo)。
grunt.initConfig({
concat: {
foo: {
// concat task "foo" target options and files go here.
},
bar: {
// concat task "bar" target options and files go here.
},
},
uglify: {
bar: {
// uglify task "bar" target options and files go here.
},
},
});
同時指定任務(wù)(task)和目標(biāo)(target)嚎货,例如grunt concat:foo
或者grunt concat:bar
橘霎,將只會處理指定目標(biāo)(target)的配置,而運(yùn)行grunt concat
將遍歷所有目標(biāo)(target)并依次處理殖属。注意姐叁,如果一個任務(wù)使用grunt.task.renameTask重命名過,Grunt將在配置對象中查找以新的任務(wù)名命名的屬性洗显。
options屬性
在一個任務(wù)配置中外潜,options
屬性可以用來指定覆蓋內(nèi)置屬性的默認(rèn)值。此外挠唆,每一個目標(biāo)(target)中還可以擁有一個專門針對此目標(biāo)(target)的options
屬性橡卤。目標(biāo)(target)級的options將會覆蓋任務(wù)級的options
。
grunt.initConfig({
concat: {
options: {
// 這里是任務(wù)級的Options损搬,覆蓋默認(rèn)值
},
foo: {
options: {
// foo目標(biāo)的Options,將覆蓋目標(biāo)級的Options
},
},
bar: {
//沒有目標(biāo)級的Options,將使用任務(wù)級的Options
},
},
});
文件
由于大多的任務(wù)都是執(zhí)行文件操作,Grunt有一個強(qiáng)大的抽象層用于聲明任務(wù)應(yīng)該操作哪些文件。這里有好幾種定義 src-dest(源文件-目標(biāo)文件)文件映射的方式巧勤,均提供了不同程度的描述和控制操作方式嵌灰。任何一種多任務(wù)(multi-task)都能理解下面的格式,所以你只需要選擇滿足你需求的格式就行颅悉。
所有的文件格式都支持src
和dest
屬性沽瞭,此外"Compact"[簡潔]和"Files Array"[文件數(shù)組]格式還支持以下一些額外的屬性:
-
filter
它通過接受任意一個有效的fs.Stats方法名或者一個函數(shù)來匹配src
文件路徑并根據(jù)匹配結(jié)果返回true
或者false
。 -
nonull
如果被設(shè)置為true
剩瓶,未匹配的模式也將執(zhí)行驹溃。結(jié)合Grunt的--verbore
標(biāo)志, 這個選項(xiàng)可以幫助用來調(diào)試文件路徑的問題。 -
dot
它允許模式模式匹配句點(diǎn)開頭的文件名延曙,即使模式并不明確文件名開頭部分是否有句點(diǎn)豌鹤。 -
matchBase
如果設(shè)置這個屬性,缺少斜線的模式(意味著模式中不能使用斜線進(jìn)行文件路徑的匹配)將不會匹配包含在斜線中的文件名枝缔。 例如布疙,a?b將匹配/xyz/123/acb
但不匹配/xyz/acb/123
。 -
expand
處理動態(tài)的src-dest
文件映射愿卸,更多的信息請查看動態(tài)構(gòu)建文件對象灵临。 - 其他的屬性將作為匹配項(xiàng)傳遞給底層的庫。 請查看node-glob 和minimatch 文檔以獲取更多信息趴荸。
簡潔格式
這種形式允許每個目標(biāo)對應(yīng)一個src-dest文件映射儒溉。通常情況下它用于只讀任務(wù),比如grunt-contrib-jshint发钝,它就只需要一個單一的src
屬性顿涣,而不需要關(guān)聯(lián)的dest
選項(xiàng). 這種格式還支給每個src-dest
文件映射指定額外的屬性。
grunt.initConfig({
jshint: {
foo: {
src: ['src/aa.js', 'src/aaa.js']
},
},
concat: {
bar: {
src: ['src/bb.js', 'src/bbb.js'],
dest: 'dest/b.js',
},
},
});
文件對象格式
這種形式支持每個目標(biāo)對應(yīng)多個src-dest
形式的文件映射笼平,屬性名就是目標(biāo)文件园骆,源文件就是它的值(源文件列表則使用數(shù)組格式聲明)≡⒌鳎可以使用這種方式指定數(shù)個src-dest
文件映射锌唾, 但是不能夠給每個映射指定附加的屬性。
grunt.initConfig({
concat: {
foo: {
files: {
'dest/a.js': ['src/aa.js', 'src/aaa.js'],
'dest/a1.js': ['src/aa1.js', 'src/aaa1.js'],
},
},
bar: {
files: {
'dest/b.js': ['src/bb.js', 'src/bbb.js'],
'dest/b1.js': ['src/bb1.js', 'src/bbb1.js'],
},
},
},
});
文件數(shù)組格式
這種形式支持每個目標(biāo)對應(yīng)多個src-dest
文件映射夺英,同時也允許每個映射擁有額外屬性:
grunt.initConfig({
concat: {
foo: {
files: [
{src: ['src/aa.js', 'src/aaa.js'], dest: 'dest/a.js'},
{src: ['src/aa1.js', 'src/aaa1.js'], dest: 'dest/a1.js'},
],
},
bar: {
files: [
{src: ['src/bb.js', 'src/bbb.js'], dest: 'dest/b/', nonull: true},
{src: ['src/bb1.js', 'src/bbb1.js'], dest: 'dest/b1/', filter: 'isFile'},
],
},
},
});
自定義過濾函數(shù)
filter
屬性可以給你的目標(biāo)文件提供一個更高級的詳細(xì)幫助信息晌涕。只需要使用一個有效的fs.Stats 方法名。下面的配置僅僅清理一個與模式匹配的真實(shí)的文件:
grunt.initConfig({
clean: {
foo: {
src: ['tmp/**/*'],
filter: 'isFile',
},
},
});
或者創(chuàng)建你自己的filter
函數(shù)痛悯,根據(jù)文件是否匹配來返回true
或者false
余黎。下面的例子將僅僅清理一個空目錄:
runt.initConfig({
clean: {
foo: {
src: ['tmp/**/*'],
filter: function(filepath) {
return (grunt.file.isDir(filepath) && require('fs').readdirSync(filepath).length === 0);
},
},
},
});
通配符模式
通常分別指定所有源文件路徑是不切實(shí)際的,因此Grunt通過內(nèi)置支持node-glob 和 minimatch 庫來匹配文件名(又叫作globbing
)载萌。
-
*
匹配任意數(shù)量的字符惧财,但不匹配/
-
?
匹配單個字符巡扇,但不匹配/
-
**
匹配任意數(shù)量的字符,包括/
垮衷,只要它是路徑中唯一的一部分 -
{}
允許使用一個逗號分割的“或”表達(dá)式列表 -
!
在模式的開頭用于排除一個匹配模式所匹配的任何文件
需要知道的是:foo/*.js
將匹配位于foo/
目錄下的所有的.js
結(jié)尾的文件厅翔;而foo/**/*js
將匹配foo/
目錄以及其子目錄中所有以.js
結(jié)尾的文件。
此外, 為了簡化原本復(fù)雜的通配符模式搀突,Grunt允許指定一個數(shù)組形式的文件路徑或者一個通配符模式刀闷。所有模式按順序處理,模式處理的過程中仰迁,帶有!
前綴的模式所匹配的文件將不包含在結(jié)果集中甸昏。 而且其結(jié)果集中的每一項(xiàng)也是唯一的。
例如:
// 指定單個文件:
{src: 'foo/this.js', dest: ...}
// 指定一個文件數(shù)組:
{src: ['foo/this.js', 'foo/that.js', 'foo/the-other.js'], dest: ...}
// 使用一個匹配模式:
{src: 'foo/th*.js', dest: ...}
// 一個獨(dú)立的node-glob模式:
{src: 'foo/{a,b}*.js', dest: ...}
// 也可以這樣編寫:
{src: ['foo/a*.js', 'foo/b*.js'], dest: ...}
// foo目錄中所有的.js文件徐许,按字母順序排序:
{src: ['foo/*.js'], dest: ...}
// 首先是bar.js施蜜,接著是剩下的.js文件,并按字母順序排序:
{src: ['foo/bar.js', 'foo/*.js'], dest: ...}
// 除bar.js之外的所有的.js文件绊寻,按字母順序排序:
{src: ['foo/*.js', '!foo/bar.js'], dest: ...}
// 按字母順序排序的所有.js文件花墩,但是bar.js在最后。
{src: ['foo/*.js', '!foo/bar.js', 'foo/bar.js'], dest: ...}
// 模板也可以用于文件路徑或者匹配模式中:
{src: ['src/<%= basename %>.js'], dest: 'build/<%= basename %>.min.js'}
// 它們也可以引用在配置中定義的其他文件列表:
{src: ['foo/*.js', '<%= jshint.all.src %>'], dest: ...}
更多關(guān)于通配符模式的語法澄步,請查看node-glob 和 minimatch 的文檔冰蘑。
動態(tài)構(gòu)建文件對象
當(dāng)你希望處理大量的單個文件時,這里有一些附加的屬性可以用來動態(tài)的構(gòu)建一個文件列表村缸。這些屬性都可以用于Compact(簡潔)和Files Array(文件數(shù)組)文件映射格式祠肥。
expand
設(shè)置為true
用于啟用下面的選項(xiàng):
-
cwd
所有src
指定的匹配都將相對于此處指定的路徑(但不包括此路徑) 。 -
src
相對于cwd
路徑的匹配模式梯皿。 -
dest
目標(biāo)文件路徑前綴仇箱。 -
ext
對于生成的dest
路徑中所有實(shí)際存在文件,均使用這個屬性值替換擴(kuò)展名东羹。 -
extDot
用于指定標(biāo)記擴(kuò)展名的英文點(diǎn)號的所在位置剂桥。可以賦值'first'
(擴(kuò)展名從文件名中的第一個英文點(diǎn)號開始) 或'last'
(擴(kuò)展名從最后一個英文點(diǎn)號開始)属提,默認(rèn)值為'first'
[添加于 0.4.3 版本] -
flatten
從生成的dest
路徑中移除所有的路徑部分权逗。 -
rename
對每個匹配的src
文件調(diào)用這個函數(shù)(在重命名后綴和移除路徑之后)。dest
和匹配的src
路徑將被作為參數(shù)傳入冤议,此函數(shù)應(yīng)該返回一個新的dest
值斟薇。 如果相同的dest
返回不止一次,那么恕酸,每個返回此值的src
來源都將被添加到一個數(shù)組中作為源列表堪滨。
在下面的例子中,uglify
任務(wù)中的static_mappings
和dynamic_mappings
兩個目標(biāo)具有相同的src-dest
文件映射列表, 這是因?yàn)槿蝿?wù)運(yùn)行時Grunt會自動展開dynamic_mappings
文件對象為4個單獨(dú)的靜態(tài)src-dest
文件映射--假設(shè)這4個文件能夠找到蕊温。
grunt.initConfig({
uglify: {
static_mappings: {
// Because these src-dest file mappings are manually specified, every
// time a new file is added or removed, the Gruntfile has to be updated.
files: [
{src: 'lib/a.js', dest: 'build/a.min.js'},
{src: 'lib/b.js', dest: 'build/b.min.js'},
{src: 'lib/subdir/c.js', dest: 'build/subdir/c.min.js'},
{src: 'lib/subdir/d.js', dest: 'build/subdir/d.min.js'},
],
},
dynamic_mappings: {
// Grunt will search for "**/*.js" under "lib/" 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: 'lib/', // src匹配開始的路徑
src: ['**/*.js'], // 相對于cwd路徑的匹配模式
dest: 'build/', //目標(biāo)文件路徑
ext: '.min.js', // 生成dest目錄中文件的擴(kuò)展名
extDot: 'first' // 文件擴(kuò)展名從第一個點(diǎn)號開始
},
],
},
},
});
模版
使用<% %>
分隔符指定的模板會在任務(wù)從它們的配置中讀取相應(yīng)的數(shù)據(jù)時將自動擴(kuò)展掃描袱箱。模板會被遞歸的展開遏乔,直到配置中不再存在遺留的模板相關(guān)的信息(與模板匹配的)。
整個配置對象決定了屬性上下文(模板中的屬性)发笔。此外按灶,在模板中使用grunt以及它的方法都是有效的,例如:` <%= grunt.template.today('yyyy-mm-dd') %>筐咧。
-
<%= prop.subprop %>
將會自動展開配置信息中的prop.subprop
的值,不管是什么類型噪矛。像這樣的模板不僅可以用來引用字符串值量蕊,還可以引用數(shù)組或者其他對象類型的值。 -
<% %>
執(zhí)行任意內(nèi)聯(lián)的JavaScript代碼艇挨。對于控制流或者循環(huán)來說是非常有用的残炮。
下面以concat
任務(wù)配置為例,運(yùn)行grunt concat:sample
時將通過banner
中的/* abcde */
連同foo/*.js
+bar/*.js
+bar/*.js
匹配的所有文件來生成一個名為build/abcde.js
的文件缩滨。
grunt.initConfig({
concat: {
sample: {
options: {
banner: '/* <%= baz %> */\n', // '/* abcde */\n'
},
src: ['<%= qux %>', 'baz/*.js'], // [['foo/*.js', 'bar/*.js'], 'baz/*.js']
dest: 'build/<%= baz %>.js', // 'build/abcde.js'
},
},
//用于任務(wù)配置模板的任意屬性
foo: 'c',
bar: 'b<%= foo %>d', // 'bcd'
baz: 'a<%= bar %>e', // 'abcde'
qux: ['foo/*.js', 'bar/*.js'],
});
導(dǎo)入外部數(shù)據(jù)
在下面的Gruntfile
中势就,項(xiàng)目的元數(shù)據(jù)是從package.json
文件中導(dǎo)入到Grunt配置中的,并且grunt-contrib-uglify 插件中的 uglify
任務(wù)被配置用于壓縮一個源文件以及使用該元數(shù)據(jù)動態(tài)的生成一個banner注釋脉漏。
Grunt有grunt.file.readJSON
和grunt.file.readYAML
兩個方法分別用于引入JSON和YAML數(shù)據(jù)苞冯。