【问题标题】:How do you publish a clickonce installer that includes .net installer and Auto-Update functionality?如何发布包含 .net 安装程序和自动更新功能的 clickonce 安装程序?
【发布时间】:2013-02-27 20:35:00
【问题描述】:

我正在使用 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>

【问题讨论】:

    标签: msbuild clickonce teamcity-7.0


    【解决方案1】:

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

    还有 2 篇 MSDN 文章详细介绍了 how to install ClickOnce prerequisitesCreating bootstrapper packages

    至于自动更新,您是否希望将自动更新功能定位在应用程序本身之外,即在安装程序中还是在应用程序中?你的应用中有several ways to allow ClickOnce updates,包括auto-updates via the ClickOnce Deployment API

    可以在this existing Stackoverflow article 中找到使用 ClickOnce Bootstrapper 包的简要说明。虽然您在这里没有使用 WiX,但您也可以查看此this WiX thread,这很有用,因为您会看到一些沿途不起作用的步骤。这些示例显示了使用 GenerateBootstrapper MSBuild task 为 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)\" />
    

    【讨论】:

    • 但是如何将“创建引导包”中的 XML 文件合并到上面的 xml 文件中以创建单击一次包?
    • 附注自动更新程序引用是正确的。我只是希望我能弄清楚如何将引导程序添加到 clickonce 安装程序。
    • 您可以使用 GenerateBootstrapper MSBuild 任务来执行此操作。我将编辑我的答案以添加一个示例。
    • 这看起来不错。让我试一试,我会在验证后将您的答案标记为正确。
    • 听起来您没有使用引导程序安装程序。 GenerateBootstrapper 任务会创建一个 setup.exe,它应该作为安装程序运行。它将提示安装 .NET 4.5 并调用 ClickOnce 安装程序(这就是您在 GenerateBootstrapper 任务中为 'ApplicationFile' 属性的值指定 .application 文件的原因)。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2010-10-02
      相关资源
      最近更新 更多