2016年10月13日 星期四
MSBuild Error MSB4094
使用 MSBuild 的 XmlPoke 更新特定 element attribute 的值,卻拋出 exception:
error MSB4094: "..." is an invalid value for the "Value" parameter of the "XmlPoke" task. Multiple items cannot be passed into a parameter of type "Microsoft.Build.Framework.ITaskItem"
研究後發現,原來是我要更新的內容包含分號 ( ; ),必須將分號跳脫成 %3B 即可
Example:
<Compile Include="MyFile.cs;MyClass.cs"/>
↓↓↓↓↓
<Compile Include="MyFile.cs%3BMyClass.cs"/>
2016年3月17日 星期四
Fix found conflicts between different versions of the same dependent assembly warning
在 Build 專案時,
發生 found conflicts between different versions of the same dependent assembly warning,
可是又不知道到底哪裡發生衝突,該如何是好呢?

請出 google 大神後,發現一個好用的工具 AsmSpy,點此下載
用法很簡單:
AsmSpy D:\...\your project\bin
產出畫面如下:
由上圖可得知 ICSharpCode.SharpZipLib 發生衝突
NPOI.DDF 用的是 v 0.85.5.452 ,
其他專案用的是 v 0.86.0.518,
此工具可以很方便的判斷衝突的發生點,再進行處理囉!
2016年3月16日 星期三
msbuild copy files - Illegal characters in path error
遇到一個 msbuild 的問題讓我十分困擾,
目前處理的專案,用到 aps.net MVC5 + Angular 2 ,以 npm 進行安裝
希望透過 msbuild 將專案 build 過後,也順道把 node_module 資料夾 copy 至 build 資料夾,
但是卻遇到 Illegal characters in path 的錯誤訊息:

所用的也是很正常的 msbuild task
所以原因出在 node_modules 這個資料夾到底出了什麼事!? 來實驗看看吧!
假設專案路徑是: C:\project\webapp
如果 copy 的路徑是:C:\project\webapp\Content 成功
如果 copy 的路徑是:C:\project\webapp\Image 成功
如果 copy 的路徑是:C:\project\webapp\node_modules 失敗
如果 copy 的路徑是:C:\project\webapp\node_modules\angular2 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\systemjs 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\es6-promise 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\es6-shim 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\reflect-metadata 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\rxjs 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\zone.js 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\gulp-typescript 失敗
如果 copy 的路徑是:C:\project\webapp\node_modules\gulp 失敗
最後終於發現是 gulp, gulp-typescript 兩個資料夾在做怪,
目前處理的專案,用到 aps.net MVC5 + Angular 2 ,以 npm 進行安裝
希望透過 msbuild 將專案 build 過後,也順道把 node_module 資料夾 copy 至 build 資料夾,
但是卻遇到 Illegal characters in path 的錯誤訊息:

所用的也是很正常的 msbuild task
<CreateItem Include="$(SourceDir)\**\*.*" Exclude="$(SourceDir)\.bin\**\*.*;">
<Output TaskParameter="Include" ItemName="NodeModulesFileItems" />
</CreateItem>
<Copy SourceFiles="@(FileItems)" DestinationFiles=
"@(FileItems->'$(OutputDir)\%(RecursiveDir)%(Filename)%(Extension)')" />
先來查看 package.json ,看看 node_module 放了哪些 package,如下:{
"name": "angular2-quickstart",
"version": "1.0.0",
"private": true,
"dependencies": {
"angular2": "2.0.0-beta.0",
"systemjs": "0.19.6",
"es6-promise": "^3.0.2",
"es6-shim": "^0.33.3",
"reflect-metadata": "0.1.2",
"rxjs": "5.0.0-beta.0",
"zone.js": "0.5.10"
},
"devDependencies": {
"gulp-typescript": "^2.10.0",
"gulp": "^3.9.0"
}
}
所以原因出在 node_modules 這個資料夾到底出了什麼事!? 來實驗看看吧!
假設專案路徑是: C:\project\webapp
如果 copy 的路徑是:C:\project\webapp\Content 成功
如果 copy 的路徑是:C:\project\webapp\Image 成功
如果 copy 的路徑是:C:\project\webapp\node_modules 失敗
如果 copy 的路徑是:C:\project\webapp\node_modules\angular2 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\systemjs 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\es6-promise 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\es6-shim 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\reflect-metadata 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\rxjs 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\zone.js 成功
如果 copy 的路徑是:C:\project\webapp\node_modules\gulp-typescript 失敗
如果 copy 的路徑是:C:\project\webapp\node_modules\gulp 失敗
最後終於發現是 gulp, gulp-typescript 兩個資料夾在做怪,
由於這兩個資料夾裡面的檔案結構又深又長,導致 copy task 在複製檔案時,
因路徑太長而拋出 Illegal characters in path 訊息,
那該如何處理呢?
在發佈時,先將這兩個資料夾刪掉,以暫時解決這個問題,
使用 removedir task 刪除資料夾,
但是仍然會發生 Illegal characters in path 錯誤,我想問題應該是跟上面一樣
2016/04/21 更新: 安裝新版的 NPM,即可解決此問題,參考
因路徑太長而拋出 Illegal characters in path 訊息,
那該如何處理呢?
在發佈時,先將這兩個資料夾刪掉,以暫時解決這個問題,
使用 removedir task 刪除資料夾,
但是仍然會發生 Illegal characters in path 錯誤,我想問題應該是跟上面一樣
<removedir directories="$(dir)"></removedir>所以只好依靠 windows command - rmdir 來處理
<Exec Command="RMDIR /S /Q $(WebNodeModulesSourceDir)\gulp"/>
<Exec Command="RMDIR /S /Q $(WebNodeModulesSourceDir)\gulp-typescript"/>
<CreateItem Include="$(SourceDir)\**\*.*" Exclude="$(SourceDir)\.bin\**\*.*;">
<Output TaskParameter="Include" ItemName="NodeModulesFileItems" />
</CreateItem>
<Copy SourceFiles="@(FileItems)" DestinationFiles=
"@(FileItems->'$(OutputDir)\%(RecursiveDir)%(Filename)%(Extension)')" />
打完收工!2016/04/21 更新: 安裝新版的 NPM,即可解決此問題,參考
訂閱:
文章 (Atom)
