[英]Odd behavior from grunt-contrib-concat when using globbing pattern
我正在使用grunt,我想按特定順序在某個目錄中合並所有js文件(這是一個有角度的js應用程序,因此我想先進行模塊定義,然后再進行其他操作)。 我的咕unt連音目標看起來像:
concat: {
mobile: {
expand: true,
cwd: "static/javascript/mobile/app/",
src: ["main-module.js", "**/*-module.js", "**/*.js", "!static/javascript/mobile/dist/*"],
dest: "static/javascript/mobile/app/dist/ngmobile.concat.js"
}
}
上面的配置似乎應該連接main-module.js,然后連接所有其他module.js文件,再連接其他所有文件,並忽略dist文件夾中的所有文件。 但是,使用--verbose運行grunt時,結果如下所示:
Running "concat:mobile" (concat) task
Verifying property concat.mobile exists in config...OK
Files: static/javascript/mobile/app/main-module.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/main-module.js
Files: static/javascript/mobile/app/clients/clients-module.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/clients/clients-module.js
Files: static/javascript/mobile/app/reports/reports-module.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/reports/reports-module.js
Files: static/javascript/mobile/app/schedules/schedules-module.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/schedules/schedules-module.js
Files: static/javascript/mobile/app/services/services-module.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/services/services-module.js
Files: static/javascript/mobile/app/clients/addclient-ctrl.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/clients/addclient-ctrl.js
Files: static/javascript/mobile/app/clients/clientprofile-ctrl.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/clients/clientprofile-ctrl.js
Files: static/javascript/mobile/app/clients/clients-ctrl.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/clients/clients-ctrl.js
Files: static/javascript/mobile/app/clients/clients-service.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/clients/clients-service.js
Files: static/javascript/mobile/app/common/directives.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/common/directives.js
Files: static/javascript/mobile/app/common/filters.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/common/filters.js
Files: static/javascript/mobile/app/common/header-ctrl.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/common/header-ctrl.js
Files: static/javascript/mobile/app/common/navbarcollapse-directive.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/common/navbarcollapse-directive.js
Files: static/javascript/mobile/app/dist/ngmobile.concat.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/dist/ngmobile.concat.js
Files: static/javascript/mobile/app/main-ctrl.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/main-ctrl.js
Files: static/javascript/mobile/app/main-service.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/main-service.js
Files: static/javascript/mobile/app/reports/reports-ctrl.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/reports/reports-ctrl.js
Files: static/javascript/mobile/app/schedules/schedules-ctrl.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/schedules/schedules-ctrl.js
Files: static/javascript/mobile/app/schedules/schedules-service.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/schedules/schedules-service.js
Files: static/javascript/mobile/app/services/addservice-ctrl.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/services/addservice-ctrl.js
Files: static/javascript/mobile/app/services/serviceprofile-ctrl.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/services/serviceprofile-ctrl.js
Files: static/javascript/mobile/app/services/services-ctrl.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/services/services-ctrl.js
Files: static/javascript/mobile/app/services/services-service.js -> static/javascript/mobile/app/dist/ngmobile.concat.js/services/services-service.js
Options: separator="\n", banner="", footer="", stripBanners=false, process=false
Reading static/javascript/mobile/app/main-module.js...OK
Writing static/javascript/mobile/app/dist/ngmobile.concat.js/main-module.js...ERROR
Warning: Unable to write "static/javascript/mobile/app/dist/ngmobile.concat.js/main-module.js" file (Error code: ENOTDIR). Use --force to continue.
Aborted due to warnings.
這告訴我,它正在查找要查找的文件,然后嘗試將它們寫入(復制?)到dest中指定的文件路徑中。 我怎么會這么嚴重地弄錯呢? :)如果有人願意把最后的幾根頭發留在我的頭上,我將非常感謝我在這里做錯了什么。 我想將src中的所有文件合並到dest文件中。
編輯
如果刪除expand屬性,則輸出如下所示:
Running "concat:mobile" (concat) task
Verifying property concat.mobile exists in config...OK
Files: main-module.js, clients/clients-module.js, reports/reports-module.js, schedules/schedules-module.js, services/services-module.js, clients/addclient-ctrl.js, clients/clientprofile-ctrl.js, clients/clients-ctrl.js, clients/clients-service.js, common/directives.js, common/filters.js, common/header-ctrl.js, common/navbarcollapse-directive.js, dist/ngmobile.concat.js, main-ctrl.js, main-service.js, reports/reports-ctrl.js, schedules/schedules-ctrl.js, schedules/schedules-service.js, services/addservice-ctrl.js, services/serviceprofile-ctrl.js, services/services-ctrl.js, services/services-service.js -> static/javascript/mobile/app/dist/ngmobile.concat.js
Options: separator="\n", banner="", footer="", stripBanners=false, process=false
>> Source file "main-module.js" not found.
>> Source file "clients/clients-module.js" not found.
>> Source file "reports/reports-module.js" not found.
>> Source file "schedules/schedules-module.js" not found.
>> Source file "services/services-module.js" not found.
>> Source file "clients/addclient-ctrl.js" not found.
>> Source file "clients/clientprofile-ctrl.js" not found.
>> Source file "clients/clients-ctrl.js" not found.
>> Source file "clients/clients-service.js" not found.
>> Source file "common/directives.js" not found.
>> Source file "common/filters.js" not found.
>> Source file "common/header-ctrl.js" not found.
>> Source file "common/navbarcollapse-directive.js" not found.
>> Source file "dist/ngmobile.concat.js" not found.
>> Source file "main-ctrl.js" not found.
>> Source file "main-service.js" not found.
>> Source file "reports/reports-ctrl.js" not found.
>> Source file "schedules/schedules-ctrl.js" not found.
>> Source file "schedules/schedules-service.js" not found.
>> Source file "services/addservice-ctrl.js" not found.
>> Source file "services/serviceprofile-ctrl.js" not found.
>> Source file "services/services-ctrl.js" not found.
>> Source file "services/services-service.js" not found.
Writing static/javascript/mobile/app/dist/ngmobile.concat.js...OK
File "static/javascript/mobile/app/dist/ngmobile.concat.js" created.
請注意,“文件:...”上方的第三行列出了我要查找的所有文件,但隨后說未找到源文件。
編輯2
Matt下面的解決方案解決了這個問題,下面是我的更新代碼:
concat: {
mobile: {
dest: "static/javascript/mobile/app/dist/ngmobile-concat.js",
src: (function () {
var cwd = "static/javascript/mobile/app/";
var files = ["*-module.js", "**/*-module.js", "**/*.js"];
files = files.map(function (file) {
return cwd + file;
});
files.push("! static/javascript/mobile/app/dist");
return files;
}())
}
}
我自己使用了棱角分明的應用程序遇到了這個問題,我考慮了以下三種選擇:
1)按照項目github線程上的建議
你不是一個人。 在grunt-contrib-concat github項目上有一個關於此問題的長篇文章 。 它與cwd
與dest
工作方式有關。
此處發布的建議解決方法將cwd
屬性移到一個函數中,該函數然后產生預期的結果,而不是ENOTDIR
錯誤。
src: (function() {
var cwd = 'src/js/';
var arr = [];
// determine file order here and concat to arr
return arr.map(function(file) { return cwd + file; });
}())
我認為缺點是在gruntfile中增加了一個功能,這通常很簡單。 如果您不是唯一維護該應用程序的人,這可能會造成混淆。
2)放棄cwd
並使用<%=%>變量語法的靜態方法
如果您的src
和dest
目錄在整個gruntfile中是一致的,則可以這樣定義src
和dest
目錄:
myapp: {
// configurable paths
app: "static/javascript/mobile/app/",
dist: "static/javascript/mobile/app/dist/"
}
...然后您可以刪除cwd
屬性並將其配置為看起來更“靜態”:
concat: {
mobile: {
expand: true,
src: ["<%= myapp.app %>/main-module.js", "<%= myapp.app %>/**/*-module.js", "<%= myapp.app %>/**/*.js", "!<%= myapp.dist %>/*"],
dest: "<%= myapp.dist %>/ngmobile.concat.js"
}
}
對於我的大多數項目來說,這就足夠了。 當我稍后回來並需要進行更改時,它非常簡單,干燥,並且易於理解。
授予:首先,在所有<%=%>混亂的情況下,配置屬性的讀取變得有些困難,但是在我的編輯器中有一些格式可以改進。 另外,另一個程序員很容易閱讀此書並了解您的意圖。
3)使用類似usemin的插件為您完成此操作
如果您還在進行縮小,則可以考慮使用類似grunt-usemin的插件。
此選項的缺點是顯而易見的:usemin增加了復雜性,因為你現在有另一個插件進行管理和配置,你將需要格式化你的HTML使用usemin功能。 起初,Usemin配置可能會造成混亂,如果您與團隊合作,則修改usemin配置或usemin需求的HTML注釋的程序員或設計人員很容易破壞事情。
好處是usemin將直接從HTML為您生成grunt的副本,concat和縮小配置。 因此,如果您添加/刪除腳本或更改HTML中的加載順序,則無需在grunt配置中執行任何操作,因為usemin會選擇它。
如果設置了'cwd',則grunt-contrib-concat僅復制文件,而不復制concat。 這個問題有一個棘手的解決方案。 只需添加“重命名”屬性並返回“目標”名稱,如下所示。
rename: function (dest) {
return dest;
},
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.