我们有一个ClickOnce应用程序,我们正在尝试使其在Azure DevOps上与CI / CD一起运行。
当前,ClickOnce先决条件设置为“从与我的应用程序相同的位置下载先决条件”,这是我们理想的行为(此应用程序安装在客户的服务器上,客户端PC下载.NET框架和各种自定义引导程序从该服务器):
当VS在我的本地开发PC上构建时,它会从本地计算机上提取那些引导程序文件(包括我们编写的一些自定义引导程序),并将它们输出到ClickOnce Publishing文件夹:
但是,这在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将它们捆绑在输出中。
答案 0 :(得分:1)
虽然不是最好的解决方案,但以下方法对我有用:
最大的缺点是占用的空间。
要发布软件包,您需要:
准备软件包
除了您的软件包外,您还需要上传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路径。 ,关于数据包如何进入该目录,您有几种选择。