顯示具有 MSBuild 標籤的文章。 顯示所有文章
顯示具有 MSBuild 標籤的文章。 顯示所有文章

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

<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 錯誤,我想問題應該是跟上面一樣
<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,即可解決此問題,參考