繁体   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