c# - 如何在 Azure Pipeline 中模拟 Visual Studio Publish

标签 c# visual-studio msbuild azure-devops azure-pipelines

我正在尝试了解如何将我的 WPF 应用程序发布到多个位置。

原因:没有所有用户都可以访问的目录/网络位置。连接到 Azure 管道的本地托管代理可以访问位置(所需的发布位置),这将允许所有用户至少有一个位置来访问应用程序。

一段时间后,我终于能够发布到这些位置。现在我想转换我的发布操作来模拟 Visual Studio 的功能。

我的意思是我希望发布文件夹看起来像这样:

1. A folder called "Application Files" 
     Containing subfolders 
         MyApplicationName_1_0_0_19
         MyApplicationName_1_0_0_20
         ...
2. `MyApplicationName.application` 
3. `Setup.exe` <- Note: I delete this file since it requires admin privileges to use. I've only included it here because Visual Studios Publish feature creates it on the first publish.

而不是它当前的样子,这是我当前发布的所有应用程序文件。

原因:运行 MyApplicationName.application 会在用户桌面上创建一个快捷方式,当应用程序启动时,它会检查更新的版本。

最后一个任务是它发布到所需位置的地方。

# ASP.NET Core (.NET Framework)
# Build and test ASP.NET Core projects targeting the full .NET Framework.
# Add steps that publish symbols, save build artifacts, and more:
# https://learn.microsoft.com/azure/devops/pipelines/languages/dotnet-core

trigger:
- master

pool: Default

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: MSBuild@1
  inputs:
    solution: 'Tenant Tool Analytics Module/*.csproj'
    msbuildArchitecture: 'x64'


- task: VisualStudioTestPlatformInstaller@1
  inputs:
    packageFeedSelector: 'nugetOrg'
    versionSelector: 'latestStable'


- task: VSTest@2
  inputs:
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **\*test*.dll
      !**\*TestAdapter.dll
      !**\obj\**
    searchFolder: '$(System.DefaultWorkingDirectory)'
    vsTestVersion: 'toolsInstaller'

- task: MSBuild@1
  inputs:
      solution: 'Tenant Tool Analytics Module/*.csproj'
      msbuildArguments: '/target:Publish /p:OutDir=c:\test2\'
      msbuildArchitecture: x64

注意:我没有使用 Azure 部署组,因为这需要管理员权限,而获得这些权限是一个漫长而缓慢的过程(目前正在进行中,无法保证)。如果最好的解决方案是通过那里,请发表评论,当我有权为部署组运行“注册脚本 (PowerShell)”时,我会发布一个新问题。

我没有创建文件“MyApplicationName.application”,而是由 Visual Studios 发布功能创建的。我在下面添加了在其中找到的代码。

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
  <assemblyIdentity name="MyApplicationName.application" version="1.0.0.20" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="amd64" xmlns="urn:schemas-microsoft-com:asm.v1" />
  <description asmv2:publisher="MyApplicationName" asmv2:product="MyApplicationName" xmlns="urn:schemas-microsoft-com:asm.v1" />
  <deployment install="true" co.v1:createDesktopShortcut="true">
    <subscription>
      <update>
        <beforeApplicationStartup />
      </update>
    </subscription>
    <deploymentProvider codebase="file://[Publish Path On Shared Network Drive]" />
  </deployment>
  <compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2">
    <framework targetVersion="4.7.2" profile="Full" supportedRuntime="4.0.30319" />
  </compatibleFrameworks>
  <dependency>
    <dependentAssembly dependencyType="install" codebase="Application Files\MyApplicationName_1_0_0_20\MyApplicationName.exe.manifest" size="7240">
      <assemblyIdentity name="MyApplicationName.exe" version="1.0.0.20" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="amd64" type="win32" />
      <hash>
        <dsig:Transforms>
          <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
        </dsig:Transforms>
        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
        <dsig:DigestValue>6P...gi+j6...nY=</dsig:DigestValue>
      </hash>
    </dependentAssembly>
  </dependency>
</asmv1:assembly>

最佳答案

由于 WPF 框架是 .NET 的一部分,您可以在构建管道中选择 .NET DeskTop 模板并使用 Publish Artifact 任务来部署 .Net 桌面应用程序构建工件到共享网络驱动器文件夹。

enter image description here

Artifact publish location设置为A file share,然后您需要输入您的网络驱动器文件夹路径。

enter image description here

如果要部署到多个网络驱动器,可以添加多个Publish Artifact 任务。可以引用这个case有类似的问题。

如果你想部署到大量的位置,又不想添加多个任务,更好的方法是使用部署组。

关于c# - 如何在 Azure Pipeline 中模拟 Visual Studio Publish,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58614804/

相关文章:

c# - 如何将 returnUrl 传递到 Blazor Server 应用程序中的登录页面?

c# - 客户端地址未经授权,并且调用者不是 Azure 中的受信任服务

visual-studio - Visual Studio 代码拼写检查器

build - TFS 2013 版本是否支持 VS 2012 解决方案?

visual-studio - MSBuild C++ 链接时依赖项

c# - 使用 ModelState 从 WebAPI 2 返回错误

c# - 如何在 jquery easy ui CRUD DataGrid 中绑定(bind) Web 服务

node.js - Visual Studio 2017 使用 Mocha

c# - xna 在 1.3GB 上触发 OutOfMemoryException

visual-studio-2010 - MSBuild调用Web项目的Package Target