2017-06-24 66 views
3

我正在自動化我的.NET標準項目(VS 2017的新csproj格式)以在構建之後生成nuget包。如何在AppVeyor中使用dotnet包?

的事情是,我想在解決方案的所有項目按照我AppVeyor構建的版本,而不是被設置的csprojs的包屬性中(即默認爲1.0.0)版本。

要考慮的另一件事是我的項目之間有引用,並應保留AppVeyor構建版本。

有沒有簡單的方法來做到這一點?怎麼樣?

回答

2

更新:.NET Core .csproj files patchingautomatic nuget packaging for .NET Core projects現在工作。


有幾個選項:

做.NET標準.csproj文件使用PowerShell的手動跳線。在這個示例中,我們更新了版本,但您也可以通過這種方式更新其他設置。

$xmlPath = "$env:appveyor_build_folder\MyProject\MyProject.csproj" 
$xml = [xml](get-content $xmlPath) 
$propertyGroup = $xml.Project.PropertyGroup | Where { $_.Version} 
$propertyGroup.Version = $env:appveyor_build_version 
$xml.Save($xmlPath) 
msbuild %appveyor_build_folder%\MyProject\MyProject.csproj /t:pack 

,或者如果你想使用.nuspec文件保留,您就可以使用這個命令包:

msbuild %appveyor_build_folder%\MyProject\MyProject.csproj /t:pack /p:Configuration=%CONFIGURATION%;NuspecFile=MyProject\MyProject.nuspec;PackageVersion=%APPVEYOR_BUILD_VERSION% 

當然您也可以使用dotnet pack但我們認爲,展望未來msbuild仍將是主要工具,所以我們嘗試使用它來執行所有腳本。

不用說,我們在AppVeyor應該不需要這個腳本,我們在https://github.com/appveyor/ci/issues/1404跟蹤這個。

+0

我不認爲csproj應該有'Version'屬性。根據[this](https://docs.microsoft.com/en-us/nuget/guides/create-net-standard-packages-vs2017),它應該是'PackageVersion'。 –

+0

根據[this](https://docs.microsoft.com/en-us/dotnet/core/tools/csproj),對於'PackageVersion',* default是$(Version)的值,也就是項目*中的屬性版本。所以,據我瞭解'版本'仍然有效,但'PackageVersion'更具體到Nuget包裝。 **加法**:我認爲對於AppVeyor中的自動修補,我們應該建議修補兩個選項並實際修補'.csproj'中真正存在的內容 – ilyaf

3

您可以通過版本的MSBuild的屬性dotnet pack

dotnet pack MyProject.csproj --configuration Release /p:Version="1.2.3" 

(這適用於dotnet build太)

這裏是在FakeItEasy build script一個例子。

要獲取AppVeyor內部版本號,請使用APPVEYOR_BUILD_VERSIONenvironment variable

要考慮的另一件事是我的項目之間有引用,並應保持AppVeyor構建版本。

這應該不是問題,因爲您沒有在<ProjectReference>元素中指定版本。