[英]How do I update my Visual Studio application automatically using 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
陷阱是那樣的;
在這種情況下,我的命令成了
"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.