如何在Azure DevOps构建服务器上使用ClickOnce引导程序先决条件?

时间:2019-02-23 14:09:38

标签: azure-devops clickonce bootstrapper

我们有一个ClickOnce应用程序,我们正在尝试使其在Azure DevOps上与CI / CD一起运行。

当前,ClickOnce先决条件设置为“从与我的应用程序相同的位置下载先决条件”,这是我们理想的行为(此应用程序安装在客户的服务器上,客户端PC下载.NET框架和各种自定义引导程序从该服务器):

ClickOnce prerequisites screen showing install location preference set

当VS在我的本地开发PC上构建时,它会从本地计算机上提取那些引导程序文件(包括我们编写的一些自定义引导程序),并将它们输出到ClickOnce Publishing文件夹:

Output from ClickOnce publish in Windows Explorer

但是,这在Azure DevOps上不起作用,我收到有关无法找到.NET引导程序的错误:

  

[错误] C:\ Program Files(x86)\ Microsoft Visual   Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin \ Microsoft.Common.CurrentVersion.targets(5390,5):   错误MSB3152:要启用“从同一位置下载先决条件   在“先决条件”对话框中,将其作为“我的应用程序”   下载文件'DotNetFX462 \ NDP462-KB3151800-x86-x64-AllOS-ENU.exe''   项目“ Microsoft .NET Framework 4.6.2(x86和x64)”到本地   机。有关更多信息,请参见   http://go.microsoft.com/fwlink/?LinkId=616018

如您所料,如果我以前提条件取消.NET 4.6.2的设置,我将不再遇到有关.NET的错误,但是很奇怪,即使这些自定义引导程序没有,我也不会收到错误消息在Azure上也不存在。差异似乎是那些自定义引导程序当前在我的本地PC上也不存在,因此在我的本地计算机上显示为带有黄色感叹号的三角形。

因此,.NET引导程序肯定不在旋转的Azure构建服务器映像中,还是可能只是一条不同的路径?

还是失败了,有没有办法告诉DevOps忽略这个问题,而只是继续构建实际的ClickOnce应用程序文件并完成构建?引导程序已经安装在我们客户的服务器上,因此我实际上不需要Azure将它们捆绑在输出中。

1 个答案:

答案 0 :(得分:1)

虽然不是最好的解决方案,但以下方法对我有用:

  1. 我创建了工件提要
  2. 我将Azure Artifacts与Universal软件包一起使用来发布引导程序软件包
  3. 在管道中,我使用“通用软件包”任务将软件包下载到“ $(System.DefaultWorkingDirectory)\ bootstrapper”中。
  4. 我将参数“ /p:GenerateBootstrapperSdkPath=$(System.DefaultWorkingDirectory)\bootstrapper”添加到msbuild

最大的缺点是占用的空间。

要发布软件包,您需要:

  • Azure CLI
  • Azure CLI的Azure DevOps扩展:安装了Azure CLI后,运行“ az扩展添加--name azure-devops”

准备软件包

除了您的软件包外,您还需要上传setup.bin文件所在的“ Engine”目录。就我而言,我是从“ C:\ Program Files(x86)\ Microsoft SDKs \ ClickOnce Bootstrapper”中获得的

我将“ Engine”和“ Schemas”目录复制到一个临时目录,然后执行:

az login

az artifacts universal publish ^
    --organization https://dev.azure.com/<MY-ORGANIZATION>/ ^
    --project = "<MY PROJECT>" ^
    --scope project ^
    --feed <MY-FEED> ^
    --name clickonce ^
    --version 16.0.28315 ^
    --description "ClickOnce Bootstrapper" ^
    --path "D:\temp\ClickOnce Bootstrapper"

在参数“名称”,“版本”和“描述”中,您可以输入所需内容,重要的是识别包装。

如果您创建的供稿与组织相关联,则该命令不应包含参数“ project”或“ scope”,您可以在您的广告中单击“连接到供稿”按钮来查看有关如何发布的示例工件提要。

然后,我为所需的每个软件包运行相同的命令,例如:

az artifacts universal publish ^
    --organization https://dev.azure.com/my-organization/ ^
    --project = "my project" ^
    --scope project ^
    --feed my-feed ^
    --name dotnet ^
    --version 4.6.2 ^
    --description "Microsoft .Net Framework 4.6.2" ^
    --path "C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages\DotNetFX462"

管道

在编译任务之前,请添加软件包的下载:

首先下载引擎,在本示例中为clickonce软件包16.0.28315

- task: UniversalPackages@0
  inputs:
    command: 'download'
    downloadDirectory: '$(System.DefaultWorkingDirectory)\bootstrapper'
    feedsToUse: 'internal'
    vstsFeed: '<MY FEED ID>'
    vstsFeedPackage: '<MY PACKAGE ID>'
    vstsPackageVersion: '16.0.28315'

当然,使用向导会容易得多,找到“通用软件包”任务,选择“下载”命令并填写其余参数。

对于您的软件包,它是相似的,只需将下载路径更改为“ $(System.DefaultWorkingDirectory)\ bootstrapper \ Packages <软件包名称>”

这时重要的一点是,如果您已经在网站上发布了软件包,则“软件包名称”与当前发布软件包的目录名称相同,因为安装程序将尝试从中下载软件包那条路。

最后,我的编译任务看起来像这样:

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'
    msbuildArgs: '/target:publish /p:GenerateBootstrapperSdkPath=$(System.DefaultWorkingDirectory)\bootstrapper'

当然,对于您自己的软件包,这更有意义。它可以与.Net Framework一起使用,但是会使用一些有价值的MB。另一种选择是在PowerShell中创建脚本,以下载并安装.Net Framework。另一个选择(如果有的话)是从FTP或文件服务器复制文件,后者适用于.Net Framework及其自身的包,唯一相关的是使用参数“ GenerateBootstrapperSdkPath”重定向Bootstrappers路径。 ,关于数据包如何进入该目录,您有几种选择。