2012-09-17 52 views
12

我有一個簡單的批處理文件,我從用於構建發佈ClickOnce項目的小型C#應用程序的DOS命令行運行。一號線是這樣的:使用MSBuild命令行指定發佈版本作爲項目的程序集版本

msbuild MyApp.csproj /t:publish /property:PublishDir="deploy/" 

這目前發佈的應用程序,但它使用的發佈版本我在Visual Studio中的「發佈」選項卡設置。我希望能夠在命令行中設置發佈版本,具體來說,我想使用項目的Assembly Version。喜歡的東西:

msbuild MyApp.csproj /t:publish /property:PublishDir="deploy/" /property:PublishVersion="$(Proj.AssemblyVersion)" 

我希望做而無需創建一個自定義的任務,因爲這只是一個臨時解決方案,我將與一個更合適的編譯系統後更換。

另外,我已經看了更新使用Mage Command Line Tool-Update標誌公佈的清單版本,但我不知道如何從項目程序集的版本號或內置組件,而無需使用PowerShell或某些程序會需要下載。如果我可以使用Visual Studio附帶的東西,那也可以。

+0

答案是否爲[這個問題](http://stackoverflow.com/questions/1859328/setting-assemblyfileversion-with-msbuild-call)有幫助嗎? – adrianbanks

+0

@adrianbanks:在批處理腳本中設置某個變量的程序集版本。我希望從程序集版本(程序集版本存儲在項目的AssemblyInfo.cs中)中設置部署版本。 –

回答

10

嘗試添加到您的.csproj文件。目標將會從輸出組件的版本,升級ApplicationVersion發佈前:

<Target Name="BeforePublish"> 
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)"> 
    <Output TaskParameter="Assemblies" ItemName="fooAssemblyInfo"/> 
    </GetAssemblyIdentity> 
    <PropertyGroup> 
    <ApplicationVersion>%(fooAssemblyInfo.Version)</ApplicationVersion> 
    </PropertyGroup> 
</Target> 

有可能是一個更好的方式來動態獲取組件的名字,但你的目的,它應該做的伎倆。

感謝這個答案爲GetAssemblyIdentity語法: https://stackoverflow.com/a/443364/266882

發問編輯:

見下文評論進行更新。

+0

我最終還是採用了另一種解決方案(稍微改變了一些規則),但是如果我的方式沒有完成,這看起來好像會起作用。謝謝! –

+0

我回到了這裏,它沒有像我預期的那樣工作。我希望在生成的部署清單中定義部署版本。但是,這是在發佈之前生成的。執行與BeforeBuld上顯示的類似的步驟將會起作用,但程序集當時不可用。我的解決方法是將版本傳遞給命令行上的msbuild,並在BeforeBuild任務中使用它。 –

+1

bin \ $(配置)\ WpfApplication1.exe可以替換爲$(TargetPath) –

8
msbuild xxx.csproj /target:clean;publish /property:ApplicationVersion=1.2.3.4 
+0

如果使用VSTS,可以使用'/property:ApplicationVersion=1.0.0. $(Build.SourceVersion)'來自動附加變更集/提交ID。當然,如果你願意的話,你仍然可以在這裏進行主要的版本控制,但是這意味着新的版本將總是有一個新版本,並且你可以隨時追溯到源版本。 –

+0

感覺很棒 - 在過去的7年中,我一直在自動遞增 –

9

爲了正確地更新清單,你需要在「AfterCompile」的步驟,而不是「BeforePublish」的步驟來修改ApplicationVersion,因爲應用程序清單是在生成時產生的部署所聲明的版本。 但是,然後你不能依靠$(TargetPath)屬性指向程序集,而是使用以下路徑:$(ProjectDir)obj \ $(ConfigurationName)\ $(TargetFileName)

因此,這裏的更新目標代碼片段,您可以添加到文件的.csproj:

<Target Name="AfterCompile"> 
    <GetAssemblyIdentity AssemblyFiles="$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)"> 
    <Output TaskParameter="Assemblies" ItemName="AssemblyInfo" /> 
    </GetAssemblyIdentity> 
    <PropertyGroup> 
    <ApplicationVersion>%(AssemblyInfo.Version)</ApplicationVersion> 
    </PropertyGroup> 
</Target> 
相關問題