簡體   English   中英

如何獲取visual studio用於發布我的應用程序的clickonce構建腳本

[英]How can I get the clickonce build script used by visual studio to publish my application

我有一個非常大的多項目解決方案。 我目前在Visual Studio中構建它,然后使用右鍵單擊=>發布選項進行發布。 這非常有效。

我現在處於需要至少自動化Clickonce發布的位置,而不僅僅是我在Visual Studio中可以做的事情。 我已經成功創建了一個publish.xml文件,我可以使用它與msbuild和mage一起創建看起來像clickonce的東西。 但是,我在visual studio界面中的配置有很多復雜性,我希望能夠簡單地復制到我的publish.xml文件中。

當visual studio從右鍵單擊=>發布過程發布時,是否有可能讓visual studio生成一個文件,該文件提供MSBuild和/或Mage使用的屬性?

基本上,我想要一個配置文件,我可以用它來做像msbuild publish.xml(或類似的)一樣的東西,並獲得visual studio的發布結果。

我目前使用的是VS2017。 該應用程序是使用c#的winforms

這是我的publish.xml。 它不應該是一個超越測試的東西

<Project> 
    <PropertyGroup>
        <OutputPathBuild>C:\Users\d_000\Documents\Visual Studio 2017\Projects\CP\CP.UI.Winforms\bin\x86\Debug</OutputPathBuild>
        <Version>1.0.0.0</Version>
        <OutputPathDeployment>C:\Users\d_000\Documents\CP Deploy\test</OutputPathDeployment>
        <Mage>C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\mage.EXE</Mage>
    </PropertyGroup>
  <Target Name="Deployment">
    <Error Condition="'$(Version)'==''" Text="The Version property must be defined in order to build the Deployment task."/>

    <ItemGroup>
      <DeploySource Include="$(OutputPathBuild)\**"/>
    </ItemGroup>
    <Copy SourceFiles="@(DeploySource)" DestinationFolder="$(OutputPathDeployment)\v$(Version)\%(RecursiveDir)"/>
    <Exec Command='"$(Mage)" -New Application -ToFile "$(OutputPathDeployment)\v$(Version)\MyApp.manifest" -Name MyApp -Version $(Version) -Processor X86 -FromDirectory "$(OutputPathDeployment)\v$(Version)" -IconFile Resources\CPIcon.ico'/>
    <Exec Command='"$(Mage)" -New Deployment -ToFile "$(OutputPathDeployment)\MyApp.application" -Name MyApp -Version $(Version) -Processor X86 -AppManifest "$(OutputPathDeployment)\v$(Version)\MyApp.manifest" -IncludeProviderURL true -ProviderURL "http://example.com/download/MyApp/MyApp.application" -Install true'/>
    <!-- Grr... Mage tool has a bug whereby -MinVersion only works in Update mode... -->
    <Exec Command='"$(Mage)" -Update "$(OutputPathDeployment)\MyApp.application" -MinVersion $(Version)'/>
    <Copy SourceFiles="$(OutputPathDeployment)\MyApp.application" DestinationFiles="$(OutputPathDeployment)\MyApp.v$(Version).application"/>
  </Target>
  </Project>

編輯:

我需要自定義發布過程中的內容,因此我希望了解Visual Studio正在做什么。 基本上我想在Visual Studio中運行命令,復制它們並調整它們,這樣我就可以使用不同的delpoy URL自動化幾個不同的構建並更新URL

k7的工作幫助我找到了我的解決方案 - 所以我把它標記為答案,但是這給出了我最終如何解決它的細節。

因此,事實證明,運行發布的所有信息都包含在項目文件中,您幾乎可以通過msbuild運行它(為了清晰起見,添加了換行符)。 對於那些剛接觸csProj文件體系結構的人來說,它包含了一般用於構建,發布和配置的項目的許多屬性,還包含一組目標,這些目標就像你可以運行的不同作業一樣。 您可以通過使用msbuild指定/ t:選項來運行它們。 未指定的目標不會被執行。

"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\bin\msbuild.EXE"
    "C:\Users\me\Documents\Visual Studio 2017\Projects\mySoln\myProj" /t:publish

陷阱是那樣的;

  1. 如果您在構建命令中而不是解決方案中引用項目,則還需要指定解決方案文件夾
  2. 除非您在發布之前指定rebuild,否則您對項目配置所做的任何更新都不會反映在輸出中 - 如果您在多個配置下發布,則會出現問題
  3. 指定部署位置
  4. 您可能還想指定平台和配置

在這種情況下,我的命令成了

"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\bin\msbuild.EXE"
   "C:\Users\me\Documents\Visual Studio 2017\Projects\mySoln\myProj" 
   /:SolutionDir="C:\Users\me\Documents\Visual Studio 2017\Projects\mySoln\\" 
   /t:rebuild /t:publish
   /p:PlatformTarget=x86 /p:Configuration=Release
   /p:PublishDir="C:\Users\me\Documents\Deploy\web\\

在這一點上,我正在重建和發布我的項目,就像我在visual studio中一樣。

當我想自定義時,我只是將其他信息添加到命令行中以覆蓋;

"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\bin\msbuild.EXE"
   "C:\Users\me\Documents\Visual Studio 2017\Projects\mySoln\myProj" 
   /:SolutionDir="C:\Users\me\Documents\Visual Studio 2017\Projects\mySoln\\" 
   /t:rebuild /t:publish
   /p:PlatformTarget=x86 /p:Configuration=Release
   /p:PublishDir="C:\Users\me\Documents\Deploy\web\\ 
   /p:UpdateUrl=http://example.com/
   /p:ExcludeDeploymentUrl=false

我想更進一步,減少一些命令,所以我修改了myProj.csProj - 但我想保持代碼分開。 我通過在項目文件中的發布信息之后直接添加導入來實現此目的(這是具有成員likePublishURL和UpdateEnabled的屬性組)。 這在相關標簽之后是直接的

<Import Project="CustomBuild.targets" />

CustomBuild.targets文件包含不同的配置。

    <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <PublishType>none</PublishType>
  </PropertyGroup>

  <Choose>
    <When Condition="'$(PublishType)' == 'web'">
      <PropertyGroup>
        <PublishDir>C:\Users\me\Documents\Deploy\Web\</PublishDir>
        <PublishUrl>C:\Users\me\Documents\Deploy\Web\</PublishUrl>
        <MapFileExtensions>false</MapFileExtensions>
        <UpdateUrl>http://www.example.com/myAppUpdate</UpdateUrl>
        <ExcludeDeploymentUrl>false</ExcludeDeploymentUrl>
        <CreateWebPageOnPublish>true</CreateWebPageOnPublish>     
    </PropertyGroup>

    </When>
    <When Condition=" '$(PublishType)' == 'network' ">
      <PropertyGroup>
        <PublishDir>C:\Users\me\Documents\Deploy\Network\</PublishDir>
        <PublishUrl>C:\Users\me\Documents\Deploy\Network\</PublishUrl>
        <MapFileExtensions>false</MapFileExtensions>
        <UpdateUrl>\\DummyServer\Share\</UpdateUrl>
        <ExcludeDeploymentUrl>true</ExcludeDeploymentUrl>
      </PropertyGroup>
    </When>
  </Choose>


</Project>

這段代碼為我提供了兩個配置(網絡和網絡),我可以在命令行中使用這個配置,簡單的開關(在我的例子中是PublishType)就像這樣;

"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\bin\msbuild.EXE"
   "C:\Users\me\Documents\Visual Studio 2017\Projects\mySoln\myProj" 
   /:SolutionDir="C:\Users\me\Documents\Visual Studio 2017\Projects\mySoln\\" 
   /t:rebuild /t:publish
   /p:PlatformTarget=x86 /p:Configuration=Release /p:PublishType=web

我的代碼沒有指定構建的自動增量,因為它與我無關,但這對於對msbuild工具和目標的一些研究相對容易 - 或者使用上面的k7中的信息。

如果要為不同階段創建ClickOnce,則必須在調用MSBuild之前操作proj文件。

1)閱讀.proj文件

$projFilePath = Get-ChildItem $sourceRootDirectory -Filter $ProjectFileName -Recurse 
$XmlDocument = [xml] (Get-Content -Path $projFilePath.FullName -Encoding UTF8) 

2)您必須在proj文件中更新此屬性:

$ClickOnceForStages.Split("Dev", "Test", "UAT", "Prod") | Foreach { 

  $XmlDocument.project.PropertyGroup[0].ApplicationRevision = $BuildRevision
  $XmlDocument.project.PropertyGroup[0].ApplicationVersion = $BuildVersion
  $XmlDocument.project.PropertyGroup[0].ProductName = "MyProductName.$_" 
  $XmlDocument.project.PropertyGroup[0].AssemblyName = "MyAssemblyName.$_"
  $XmlDocument.project.PropertyGroup[0].PublishUrl = "MyClickOnceDropUncPath_$_"
}      

你必須確保:

$BuildRevision and $BuildVersion 

每個版本都有一個增加的版本。

3)保存文檔而不操作原始proj文件。

$currentProjFilePath = $projFilePath.FullName +"_" + $_ + ".proj"
$XmlDocument.Save($clickOnceProjFilePath)

4)調用MSBuild以創建ClickOnce安裝程序。

"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe"

proj文件與ClickOnce配置和MSBuild參數的組合:

"/target:publish"

創建ClickOnce安裝程序。

這是我用來創建ClickOnce安裝程序的完整MSBuild語句:

"$clickOnceProjFilePath", 
"/target:publish", 
"/p:PublishDir=$outputDirectory", 
"/p:Configuration=Release"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM