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>
4

2 回答 2

4

您可以使用引导程序来处理先决条件,例如检查 .NET Framework。查看应用程序部署先决条件MSDN 文章,尤其是有关使用 ClickOnce 和 MSBuild 引导的部分。

还有 2 篇 MSDN 文章详细介绍了如何安装 ClickOnce 先决条件创建引导程序包

至于自动更新,您是否希望将自动更新功能定位在应用程序本身之外,即在安装程序中还是在应用程序中?有几种方法可以在您的应用程序中允许 ClickOnce 更新,包括通过 ClickOnce 部署 API 自动更新

可以在现有的 Stackoverflow 文章中找到使用 ClickOnce Bootstrapper 包的简要说明。虽然您在这里没有使用 WiX,但您也可以查看这个 WiX 线程,这很有用,因为您会看到一些在此过程中不起作用的步骤。这些示例显示了使用GenerateBootstrapper MSBuild 任务为 ClickOnce 安装程序创建引导程序。请注意,在上述链接的示例中,GenerateBootstrapper 任务中的“路径”设置为 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)\" />
于 2013-02-28T13:39:59.313 回答
1

刚刚在“ https://stackoverflow.com/a/39610060/1345870 ”上发布了回复:

我自己只是为此苦苦挣扎-我选择将引导程序文件提交到源代码控制。可以覆盖引导程序的路径,只需提供/p:GenerateBootstrapperSdkPath=.build\Bootstrapper

然后无需修改注册表 - 并且构建现在是独立的。

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

于 2016-09-21T07:28:27.640 回答