基於.net core實現項目自動編譯、並生成nuget包


      近期想對自己的項目增加自動編譯並生成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文件等,但還好最終還是解決解決。回過頭來看,其實遇到問題換個角度,打開思維才是最重要的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM