
我們知道使用VSTS中的Packages Manager可以建立企業或是私有的Nuget Server,在一般.Net Framework下,可以用下面幾個步驟建立Nuget的Package,其中使用到的是MSBuild
做編譯,再用Nuget指令打包成Package

不過,今天若是也這樣對.Net Core
專案進行封裝,雖然會成功,但是,當在.Net Core
專案下載來用時候,就會出現你使用了.Net Framework,不能使用在.Net Core專案中,請使用XXXXX字樣,主要原因是在編譯時候,單純使用MSbuild的Task,會被使用.Net Framework進行編譯封裝所造成的問題,網路上有人說可以採用/t:package
方式克服,不過,既然使用了.Net Core
,就改用.Net Core
方式做CI & CD吧
.Net Core專案檔設定
首先啟用的專案類型是.Net Core Libray
之前在.Net Framework
時期專案,因為封裝成Nuget Package,必須透過.nuspec
檔案把元件資訊填入,這樣別人才可以知道這個元件用途以及相關資訊,在.Net Core專案底下,已經可以省略這個檔案了,因為,要把這些需要填入資訊已經納入專案檔中了,在專案按右鍵找到屬性設定
針對整個專案設定部分,會多出一個Package
頁簽,會發現填入的資訊跟.nuspec
檔案內容是大同小異,只是這邊已經被限定好欄位了,上面有兩個需要打勾的,基本上是不需要去勾選
VSTS Build設定
在Build設定中,基本的完整流程如下:
Nuget Restore
在Nuget Task,要注意的就是它的Task Version,記得一定要選到最新版本,若是有Nuget.config
檔案,也記得要放上去

donet Build
donet Task這裡如果只是單純Build .Net Core專案倒是不需要注意Task版本,但是,如果要封裝Package,記得選到最新版本,目前版本最新是2 Preview
,因為在最新版本才會有Pack
的指令,這裡的Path to project
專案路徑,不能用選的,必須要用手敲入,記得不能打錯路徑,不然會失敗
donet pack
重頭戲是在這邊,搞定這個搞超久,再提一次,記得選到最新版本,不然會找不到Pack
指令

此外,這邊有一個小坑,就是在Path to csproj or nuspec file(s) to pack
提到可以使用.nuspec
檔案作為Package的資訊檔案,但是,當我指定.nuspec
檔案時候,就會出現不支援.nuspec
檔案格式是沒問題的,所以,就指定.csproj
,前面有提到,在.Net Core已經可以把封裝資訊放入專案檔,用處就是在這裡要被使用的。此外,我喜歡用Buil Number來作為Package版本號,也在Automatic package versioning
中選用使用環境變數
作為版號,而環境變數就是使用Build.BuildNumber
另一個要提醒的是這邊先不要把Do Not Build
打勾,話說前面不是已經有Build過嗎?因該不需要再Build,這裡的Build主要是要做封裝用,所以還是必須要Build一次。
到這裡基本上就大功告成,後面兩個Task,主要是把封裝檔案上傳到發布區域,等待後面的發行
VSTS Release
到這裡只需要用一個Task就可以進行發佈到團隊的Packages中
只要選擇Nuget Publish,把相關資訊田入就可以,唯一要注意是要選擇4.0版本的Nuget指令
以上就能完成在VSTS針對.Net Core的CI / CD 了,有一些眉眉角角必須多踏過,不然還真的跑不出來,所以,不管是.Net Framework或是.Net Core都可以自動化封裝成Nuget Package