2017-04-07 215 views
19

這個問題與Setting the version number for .NET Core projects非常相似,但不一樣。在撰寫本文(1.1)和VS2017時使用最新的.NET Core穩定版本時,.NET Core已從基於JSON的項目文件切換到CSPROJ文件。設置.NET Core項目的版本號 - CSPROJ - 不是JSON項目

所以 - 我想要做的是建立一個CI環境,我希望能夠修改之前的一個構建使用正確的版本號標記我的版本。

如果我這樣使用老(SharedAssemblyInfo.cs招)的屬性:

[assembly: AssemblyFileVersion("3.3.3.3")] 
[assembly: AssemblyVersion("4.4.4.4")] 

在項目的某個地方,我得到
CS0579 - Duplicate 'System.Reflection.AssemblyFileVersionAttribute'

CS0579 - Duplicate 'System.Reflection.AssemblyVersionAttribute'
錯誤時建設。

當挖掘到這一點,我發現有一個文件,它看起來像這樣在\obj\Debug\netcoreapp1.1在構建過程中(我之前建立它不存在)產生:

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated by a tool. 
//  Runtime Version:4.0.30319.42000 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

using System; 
using System.Reflection; 

[assembly: System.Reflection.AssemblyCompanyAttribute("TestApplication")] 
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] 
[assembly: System.Reflection.AssemblyDescriptionAttribute("Package Description")] 
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.99.0")] 
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.99")] 
[assembly: System.Reflection.AssemblyProductAttribute("TestApplication")] 
[assembly: System.Reflection.AssemblyTitleAttribute("TestApplication")] 
[assembly: System.Reflection.AssemblyVersionAttribute("1.1.99.0")] 

// Generated by the MSBuild WriteCodeFragment class. 

問題 - 我該如何做這一點?
所以我可以看到這必須以某種方式從項目屬性「包頁面」中輸入的值生成,但我不知道在CI機器上更改這些值的正確方法是什麼。

理想情況下,我希望能夠在我的(詹金斯)CI腳本中指定所有這些信息,但我只能設置版本號。

編輯 - 更多信息
讀取第一個答案之後,我想弄清楚,我既創造服務的NuGet包 - 我寧願版本的一切的1路,這將是像舊的JSON項目,我可以只更新一個文件。

UPDATE 我的腳本更改了的csproj文件,這在我看來是相當哈克,因爲我需要修改看起來像這樣的節會...

<PropertyGroup> 
<OutputType>Exe</OutputType> 
<TargetFramework>netcoreapp1.1</TargetFramework> 
<Version>1.0.7777.0</Version> 
<AssemblyVersion>1.0.8888.0</AssemblyVersion> 
<FileVersion>1.0.9999.0</FileVersion> 
<Company>MyCompany</Company> 
<Authors>AuthorName</Authors> 
<Product>ProductName</Product> 
<Description /> 
<Copyright>Copyright © 2017</Copyright> 
</PropertyGroup> 

所以 - 問題這裏有多個'PropertyGroup'元素;其他人似乎被貼上標籤 - 但不知道CSPROJ是如何放在一起的,我不能說這總是如此。

我工作的前提是包的細節將始終填充,否則值標記(上面)不會出現在XML中 - 所以然後我可以使用腳本來更新值。如果值標籤不存在,我不清楚哪個PropertyGroup元素插入值(以及哪個順序,因爲這看起來很重要;更改順序使我無法在VS2017中加載項目)。

我仍然抱着比這更好的解決方案!

更新:有人將這個問題標記爲可能的副本(Auto Versioning in Visual Studio 2017 (.NET Core)) - 之前我沒有看到過這個問題,現在看來它似乎幾乎相同,只是我不想設置版本號。此外,這個問題的答案不能解決我的問題 - 只會問我在問題中提出的問題。對我的問題的接受答案正是我需要解決我的問題的答案 - 所以當另一個問題首先出現並且看起來相同時 - 它根本沒有幫助我。也許一個國防部可以幫助?

+0

[自動版本控制在Visual Studio 2017(.NET Core)]中可能出現重複(http://stackoverflow.com/questions/43019832/auto-versioning-in- visual-studio-2017-net-core) – Tagc

+0

包含解釋的更新答案 - 我沒有看到該帖子;它似乎是相同的,但它不回答我的問題。這篇文章的接受答案完美地回答了我的問題。 – Jay

回答

24

你可以通過/p:PropertyName=Value作爲參數傳遞給dotnet restoredotnet builddotnet pack覆蓋命令行中的任何財產。

目前,版本組成工作原理是: 如果Version沒有設置,使用VersionPrefix(默認爲1.0.0,如果取消設置)和 - 如果存在的話 - 追加VersionSuffix

所有其他版本默認爲Version

因此,例如,你可以在你的csproj設置<VersionPrefix>1.2.3</VersionPrefix>,然後調用dotnet pack --version-suffix beta1產生YourApp.1.2.3-beta1.nupkg(如果你有你想要的版本,後綴將應用於以及項目的參考,你需要在這之前調用dotnet restore /p:VersionSuffix=beta1 - 這是工具中已知的錯誤)。

當然,您也可以使用自定義變量,有關幾個示例,請參閱this GitHub issue

有關受支持的程序集屬性的完整參考,我建議查看構建邏輯的源代碼here(用$()包圍的值是使用的屬性)。 由於我已經在談論源代碼,this是組成版本和其他一些屬性的邏輯。

+0

'/ p:'參數可能是我正在尋找;我正在閱讀的內容是.NET Core 1.1的新版本,它將參數直接傳遞給dotnet msbuild(也是.NET Core 1.1中的新增功能)。我將不得不在週末玩這個遊戲,看看它是否給了我期望的結果,但看起來很有希望。 – Jay

+0

剛剛試過這個,並且它是傳遞給'dotnet msbuild'命令的'/ p:'參數,它爲我完成了這個技巧。謝謝! – Jay

3

我用詹金斯+八達通CI,並按照相當奏效:

  1. 有一個預先構建Powershell腳本,可以採取建立CI號作爲PARAM或默認的東西預設。
  2. CI的項目中有一個單獨的nuspec文件。
  3. 預生成腳本將使用最新的內部版本更新nuspec文件。
  4. 與Jenkins發佈項目。
  5. 使用#2的nuspec文件手動撥打電話Nuget
  6. nuget包推到八達通。
+0

nuspec文件是否適用於軟件包?我沒有計劃打包所有東西 - 我正在創建一系列業務微服務,這些服務最終將在Linux環境中執行(可能位於碼頭集裝箱中)。無論如何,如果nuspec只是標記NuGet包,那麼這不是我所追求的(雖然它很有用)。 – Jay

+0

是的,不幸的是只有包... – Ignas

+2

沒問題,你仍然教我一些東西,因此upvote :) – Jay

5

要直接回答您的問題:msbuild的新SDK將自動生成程序集信息文件。您可以使用msbuild指令來抑制該指令(通過示例查看它:在基於project.json的項目上調用dotnet migrate)。

但讓我告訴你我的處理:我有多個項目共享相同的版本。我添加了一個version.props文件,其中包含一個屬性組,其中包含一個名爲VersionPrefix的項目。我通過csproj文件包含這個文件(Include聲明)。我還刪除了所有AssemblyInfo.cs文件,並讓SDK爲我生成它們。

我在構建期間修改version.props文件。

+3

如果您在目錄層次結構中創建一個名爲'Directory.build.props'的文件,它將自動導入,並且您不需要''指令。 –

+0

太棒了。謝謝。 – Thomas

+2

+1:它也是一個有用的答案,但是我已經用@ MartinUllrich的答案去了,因爲構建命令行比修改文件更容易,因爲我在最小的Linux中完成了這一切環境。 – Jay

0

正如我回答here,我做了一個名爲dotnet-setversion的CLI工具,您可以使用它來版本化* .csproj樣式的.NET Core項目。

在構建CI期間,可以使用GitVersion或其他工具來確定項目的版本號,然後在項目根目錄中調用dotnet-setversion $YOUR_VERSION_STRING

+0

它非常聰明,但我可能不理解爲什麼你會使用這個,只要將'/ p:'參數傳遞給'dotnet msbuild'就可以完成這個問題的接受答案中所建議的工作?看看源代碼,這看起來像只更新'Version'元素。 – Jay

+0

@Jay我甚至不知道它存在。 「/ p」標誌在1.1.0中似乎是新的。如果你運行'dotnet --help',它甚至不會提到這個標誌。我已經提出了接受的答案。 – Tagc

+0

此外,它只更新'版本'元素,因爲這是所有必需的(你也可以包含後綴信息)。如果您設置了'Version',則不需要設置'VersionSuffix'或'VersionPrefix'。 – Tagc

1

如果您在項目文件中丟失了它們,MsBuild 2017會生成一些程序集信息。

如果你可以看到你可以看看的MSBuild目標文件:

[VS Install Dir] \MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.GenerateAssemblyInfo.targets

你會看到在你的項目文件中禁用生成的程序集信息,以防止你的生成工具複製你可以使用一些屬性。

  • <GenerateAssemblyInfo>(該屬性將開/關所有生成組件信息)
  • <GenerateAssemblyCompanyAttribute>
  • <GenerateAssemblyConfigurationAttribute>
  • <GenerateAssemblyCopyrightAttribute>
  • <GenerateAssemblyDescriptionAttribute>
  • <GenerateAssemblyFileVersionAttribute>
  • <GenerateAssemblyInformationalVersionAttribute>
  • <GenerateAssemblyProductAttribute>
  • <GenerateAssemblyTitleAttribute>
  • ​​3210
  • <GenerateNeutralResourcesLanguageAttribute>
5
dotnet build /p:AssemblyVersion=1.2.3.4 

爲你做這項工作?

+0

它的確如此,但這個答案與這個問題的接受答案有什麼不同或添加了什麼(這是4個月前發佈的)? – Jay

+1

它更簡潔 - 但上面的答案沒有提到完全設置AsemblyVersion屬性。它繼續關於VersionPrefix和VersionSuffix以及編輯csproj文件等,提到您可以從命令行設置所需的任何屬性,但不會提供用於完成請求結果的實際命令行。我碰巧遇到了這個問題,尋找我最終找到的答案 - 但沒有在這裏找到答案。 –

+0

對不起,我不能滿足這一點,它完全涵蓋了馬丁的答案,它指示我檢查msbuild命令行參考\源代碼,如果你讀我的問題,(最終更新),我不只是試圖設置版本號。也許你的帖子會幫助別人。 – Jay