近期想對自己的項目增加自動編譯並生成nuget包,網上資料不少。但總還有迷糊的時候。首先:此解決方案包含多種版本的項目,如:有編譯必須是x86平臺,以及還有傳統的.net foramework項目,以及多版本的.net core項目等。找到通用的解決方案還是用了不少的時間。本文章就對此做下自我總結。... ...
近期想對自己的項目增加自動編譯並生成nuget包,網上資料不少。但總還有迷糊的時候。首先:此解決方案包含多種版本的項目,如:有編譯必須是x86平臺,以及還有傳統的.net foramework項目,以及多版本的.net core項目等。找到通用的解決方案還是用了不少的時間。本文章就對此做下自我總結。望對同仁有所幫助。
一、遇到的問題,以及解決辦法
1.1 不同平臺的編譯怎麼辦
.net可以將dll(或者說是項目)編譯成x86、x64、anycpu 等至少三種平臺代碼。但如果用dotnet build生成項目時,預設是anycpu,需要通過platform參數來執行平臺。可是,如果你一個解決方法中即有x86項目、又有anycpu項目可怎麼是好呢。解決辦法:創建兩個sln文件,一個用x86平臺的編譯,一個用於anycpu平臺的編譯。
1.2 傳統.net framework項目,怎麼用dotnet 進行編譯
這個問題其實最終的解決辦法也很簡易,就是將.net framework項目直接遷移成dotnet 可編譯的項目。步驟以一個.net 4.6.1項目為例:
- 傳統的.net framework項目
- 卸載此項目,並編輯.csproj文件
當前步驟編輯好的.csproj文件如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net461</TargetFramework> </PropertyGroup> </Project>
- 移除Properites中的assemblyInfo文件
因為dotnet 會自動創建assemblyInfo相關的信息文件,如果要自定義,可以找到相關資料進行限制
註意,少了assemblyinfo.cs文件。
- 還原相關引用
生成項目,根據提示引用相關類型,預設調整後的是 類庫 文件,如果需要變成 應用執行程式,可以自己修正即可。
- 生成並運行
在還原好依賴項,以及調整好輸出類型後,即可完成 項目的遷移。最終的項目結果:
以及最終生成的csproj文件:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net461</TargetFramework> <ApplicationIcon /> <OutputType>Exe</OutputType> <StartupObject /> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\..\src\SAM.Configuration\SAM.Configuration.csproj" /> <ProjectReference Include="..\..\src\SAM.Framework\SAM.Framework.csproj" /> </ItemGroup> </Project>
-
多版本的支持
如果你需要的項目即能在.net40,.net461, .net core2.0上運行,那就需要做到多版本相容。方式即為簡單,需要將TargetFramework改為TargetFrameworks,然後多版本用分號隔開即可:
<TargetFrameworks>net461;net40;netcoreapp2.0</TargetFrameworks>
二、統一實現
在解決了上述三個主要問題之後,實現自動編譯和出包就很簡單。我們可以寫一個ps1文件來實現,也就是powershell腳本,整體代碼如下:
#定義全局變數 $destFolder = Get-Location; $version = "1.0.0.0-alpha"; #編譯anycpu的包 $anycpuPath = $destFolder.Path + "\..\SAM.Framework.anycpu.sln"; dotnet pack $anycpuPath --output $destFolder.Path /p:PackageVersion=$version; #編譯x86的包 $anycpuPath = $destFolder.Path + "\..\SAM.Framework.x86.sln"; dotnet pack $anycpuPath --output $destFolder.Path /p:PackageVersion=$version /p:platform=x86; pause
是不是很簡單,幾句代碼就是實現將所有項目生成nuget包。且還可以分平臺實現。核心參數說明:
- /p:是設置msbuild相關參數的入口,如:包版本(版本在dotnet core上好像此支持三個階段,如:1.0.0這種,而四階段沒有了),以及平臺等。
- --output:生成的包輸出文件夾
此命令還有些不足點,如 anycpu和x86中都編譯同一個項目,後者的編譯會覆蓋前者(感覺可以用nuget包依賴來解決)。
三、後話
在解決此問題之前,本人也走了不少的彎路。如尋找msbuild與dotnet build的相容方案,以及如何動態修正sln文件等,但還好最終還是解決解決。回過頭來看,其實遇到問題換個角度,打開思維才是最重要的。