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

7

我正在使用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>
2个回答

4
你可以使用引导程序来处理前提条件,例如检查.NET Framework。请参阅应用程序部署前提条件MSDN文章,特别是关于使用ClickOnce和MSBuild进行引导的部分。
还有两篇MSDN文章详细介绍如何安装ClickOnce前提条件创建引导程序包
关于自动更新,您想将自动更新功能放在应用程序之外,例如安装程序中而不是应用程序内部吗?您的应用程序有几种允许使用ClickOnce更新的方法,包括通过ClickOnce Deployment API进行自动更新
这篇现有的Stackoverflow文章中可以找到有关使用ClickOnce Bootstrapper包的简要说明。虽然您没有在此处使用WiX,但您也可以查看this WiX thread,因为您可以看到一些未能成功的步骤。这些示例展示了使用GenerateBootstrapper MSBuild任务创建ClickOnce安装程序的引导程序。请注意,在上述链接中的示例中,“GenerateBootstrapper”任务中的“Path”设置为Windows SDK位置下的子文件夹。只要该位置具有必要的先决条件包,就可以将其更改为其他位置。
以下是一个例子,其中.NET 4.5 Framework被设置为安装的先决条件。 .NET 4.5先决条件的父目录结构由$(MyPathToPrerequisitePackages)属性指定。
以下示例中的BootstrapperFile项指定了.NET 4.5 Framework先决条件包。值“.NETFramework,Version = v4.5”来自Bootstrapper \ Packages \ DotNetFX45文件夹中的product.xml文件,并允许GenerateBootstrapper任务正确识别.NET 4.5先决条件/启动程序包。 "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)\" />

但是,您如何将“创建引导程序包”中的XML文件合并到上面的xml文件中以创建单击一次包? - PlTaylor
你可以使用GenerateBootstrapper MSBuild任务来完成这个操作。我会编辑我的答案并添加一个例子。 - Michael
这看起来不错。让我试一下,验证后我会将您的答案标记为正确的。 - PlTaylor
@PITaylor,最后一次修改应该让您很容易地添加.NET 4.5先决条件。您已经验证了吗? - Michael
1
听起来你没有使用引导安装程序。GenerateBootstrapper任务会创建一个setup.exe文件,应该作为安装程序运行。它会提示安装.NET 4.5,并调用ClickOnce安装程序(这就是为什么在GenerateBootstrapper任务的'ApplicationFile'属性值中指定.application文件)。 - Michael
显示剩余9条评论

1

我在 'https://dev59.com/SHA65IYBdhLWcg3w6DJO#39610060' 上发布了一个回复:

我自己也曾经遇到过这个问题 - 我选择将引导程序文件提交到源代码控制中。可以重写引导程序的路径,只需提供 /p:GenerateBootstrapperSdkPath=.build\Bootstrapper

然后就不需要修改注册表了 - 并且额外的好处是构建现在是自包含的。

唯一的 "问题" 是我必须手动将引导程序文件复制到源代码控制中。在我的情况下 (VStudio2015),这意味着从 C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper 复制文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接