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,即可解決此問題,參考

2016年3月15日 星期二

Windows IoT Core & Raspberry Pi 3 - install

最近 Raspberry Pi 終於出到第 3 版了,內建 wifi, BLE,有興趣就買囉!
再搭配 Windows IoT Core 平台來試試!

安裝步驟如下:

  • 安裝 Windows 10 IoT Core Dashboard
  • 安裝  Windows 10 IoT Core 至 MicroSD 
    • 安裝步驟參考:Manually set up your device
      1. 下載Windows 10 IoT Core Insider Preview iso 檔後,直接在 win10 掛載後,安裝裡面的 【Windows 10 IoT Core for Raspberry Pi ......msi】 即可。
      2. 執行 IoT Dashboard 設定新裝置
        1. Device Type:Custom
        2. image file:【"C:\Program Files (x86)\Microsoft IoT\FFU\RaspberryPi2\flash.ffu"】。
      3. click 【Download and install】。
      4. 安裝結束後, MicroSD  插到 Raspberry Pi 3,接上電源線即可。
    • 這邊有非常重要的一點,MicroSD 會挑片,必須用官方認證過的
      • 否則畫面會卡住進不了系統,畫面會卡在 "please wait while we get things ready",然後等到天荒地老也不會有下一步
      • 可用的 MicroSD  參考:Hardware Compatibility List
        • Samsung 32GB EVO Class 10 Micro SDHC
        • SanDisk Ultra Micro SDHC 16GB

  • 啟動畫面1


  • 啟動畫面2


  • 啟始設定畫面


  • 開始畫面




  • 將 Raspberry Pi 3 接上網路線後,回到 windows 10 後,在 IoT Dashboard 切到 My Device 頁籤,看到 Raspberry Pi 即代表成功囉!