Msbuild 如何发布包含.net安装程序和自动更新功能的clickonce安装程序?

Msbuild 如何发布包含.net安装程序和自动更新功能的clickonce安装程序?,msbuild,clickonce,teamcity-7.0,Msbuild,Clickonce,Teamcity 7.0,我使用TeamCity作为持续集成服务器,并使用ClickOnce安装程序部署我的应用程序。我可以让安装程序运行并部署我的应用程序,但我无法确定如果计算机尚未安装.net 4.5的安装程序,如何包含该安装程序,或者如何在ClickOnce部署中启用自动更新检查功能。我当前正在使用下面的MSBuild文件构建安装程序 <Project DefaultTargets="DoPublish" ToolsVersion="4.0" xmlns="http://schemas.microsoft.c

我使用TeamCity作为持续集成服务器,并使用ClickOnce安装程序部署我的应用程序。我可以让安装程序运行并部署我的应用程序,但我无法确定如果计算机尚未安装.net 4.5的安装程序,如何包含该安装程序,或者如何在ClickOnce部署中启用自动更新检查功能。我当前正在使用下面的MSBuild文件构建安装程序

<Project DefaultTargets="DoPublish" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
  <PropertyGroup>
    <Version>$(BUILD_NUMBER)</Version>
    <Install>true</Install>
    <InstallFrom>Unc</InstallFrom>
    <UpdateEnabled>true</UpdateEnabled>
    <UpdateMode>Background</UpdateMode>
    <ClickOnceBuildDirectory>$(MSBuildProjectDirectory)\MyProject\bin\$(Configuration)\app.publish</ClickOnceBuildDirectory>
    <ClickOnceInstallDirectory>$(MSBuildProjectDirectory)\Publish</ClickOnceInstallDirectory>
    <ClickOnceFinalLocation>$(env_PublishUrl)</ClickOnceFinalLocation>
  </PropertyGroup>
  <Target Name="DoPublish">
    <RemoveDir Directories="$(ClickOnceInstallDirectory)" ContinueOnError="true" />
    <MSBuild Projects="MyProject.sln" Targets="Clean;Build" Properties="ApplicationVersion=$(Version);Configuration=$(Configuration)"/>
    <MSBuild Projects="MyProject\MyProject.csproj" Targets="Publish" Properties="ApplicationVersion=$(Version);Configuration=$(Configuration);InstallUrl=$(ClickOnceFinalLocation)" />
    <MakeDir Directories="$(ClickOnceInstallDirectory)"/>    
    <Exec Command="xcopy /E $(ClickOnceBuildDirectory) $(ClickOnceInstallDirectory)" />    
  </Target>  
</Project>

$(建筑编号)
真的
北卡罗来纳大学
真的
背景
$(MSBuildProjectDirectory)\MyProject\bin\$(配置)\app.publish
$(MSBuildProjectDirectory)\Publish
$(env_PublishUrl)

您可以使用引导程序处理先决条件,如检查.NET Framework。查看MSDN文章,特别是关于使用ClickOnce和MSBuild引导的部分

还有另外两篇MSDN文章详细介绍了和

至于自动更新,您是否希望将自动更新功能定位在应用程序本身之外,即安装程序中还是应用程序中?您的应用程序中有,包括

有关使用ClickOnce引导程序包的简要说明,请参阅。虽然您没有在这里使用WiX,但是您也可以检查这一点,这很有用,因为您可以看到一些在此过程中不起作用的步骤。这些示例显示如何使用为ClickOnce安装程序创建引导程序。请注意,在上述链接的示例中,GenerateBootstrapper任务中的“路径”设置为Windows SDK位置下的子文件夹。只要该位置具有必要的必备软件包,就可以将其更改到其他位置

下面是一个示例,其中.NET 4.5 Framework被设置为安装的先决条件。.NET 4.5先决条件的父目录结构由$(MyPathTopreRequestSitePackages)属性指定

下面示例中的BootstrapperFile项指定了.NET 4.5 Framework必备软件包。值“.NETFramework,Version=v4.5”来自Bootstrapper\Packages\DotNetFX45文件夹中的product.xml文件,并允许GenerateBootstrapper任务正确识别.NET 4.5先决条件/Bootstrapper包。“ProductName”值只是对软件包的友好描述

<PropertyGroup>
  <MyPathToPrerequisitePackages>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\Bootstrapper</MyPathToPrerequisitePackages>
</PropertyGroup>
<ItemGroup>
  <BootstrapperFile Include=".NETFramework,Version=v4.5">
    <ProductName>.NET Framework 4.5</ProductName>
  </BootstrapperFile>
</ItemGroup>
<GenerateBootstrapper 
  ApplicationFile="$(MyAppAssembly).application"
  ApplicationUrl="$(MyClickOnceAppUrl)"
  ApplicationName="$(MyClickOnceAppName)"
  BootstrapperItems="@(BootstrapperFile)"
  Culture="en"
  FallbackCulture="en-US"
  CopyComponents="true"
  Validate="false"
  Path="$(MyPathToPrerequisitePackages)"
  SupportUrl="$(MyAppSupportUrl)"
  OutputPath="$(MyDesiredOutputPath)\" />

C:\ProgramFiles(x86)\Microsoft SDK\Windows\v8.0A\Bootstrapper
.NET Framework 4.5

刚刚在“”上发布了响应:

我自己也在挣扎——我选择将引导程序文件提交给源代码管理。可以覆盖引导程序的路径,只需提供
/p:GenerateBootstrapperSdkPath=.build\Bootstrapper

这样就不需要修改注册表了,而且增加的好处是构建现在是自包含的


唯一的“问题”是我必须手动将引导程序文件复制到源代码管理中。在我的例子(VStudio2015)中,这意味着从
C:\Program files(x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper

复制文件,但如何将“创建引导包”中的XML文件合并到上面的XML文件中,以创建一个单击一次的包?p.s.自动更新程序引用就在上面。我只是希望我能想出如何将引导程序添加到clickonce安装程序中。您可以使用GenerateBotstrapper MSBuild任务来完成此操作。我将编辑我的答案以添加一个示例。这看起来不错。让我试一下,我会在验证后将您的答案标记为正确。听起来您没有使用引导程序安装程序。GenerateBootstrapper任务创建一个setup.exe,该setup.exe应作为安装程序运行。它将提示进行.NET 4.5安装,并调用ClickOnce安装程序(这就是为什么在GenerateBootstrapper任务中为'ApplicationFile'属性的值指定.application文件)。