Создайте MSI в Azure DevOps с помощью инструментария Wix

#c# #azure-devops #wix #windows-installer

Вопрос:

У меня есть решение Visual Studio, состоящее из двух проектов: MyProject и MyProject.Установщик, где последний является проектом набора инструментов Wix. Я не ссылаюсь на MyProject из проекта Wix, потому что мне нужны не типичные выходные данные сборки, а скорее автономные двоичные файлы (см. Конвейер).

Я публикую в dotnet и выводю файлы, которые я хочу client, относительно MyProject.Установщик проекта wix. В файле Product.wxs я ссылаюсь на эти файлы:

 <Component Id="MyProject.exe" Guid="b1211231-2e88-4679-b2d3-879e8a3f9353">
    <File Id="MyProject.exe" Source="clientMyProject.exe" KeyPath="yes"  />
</Component>
 

Мой конвейер Azure DevOps выглядит следующим образом:

 trigger:
- master

pool:
  vmImage: 'windows-latest'
variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
steps:
- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: '**/MyProject.csproj'
    arguments: '--output $(Build.ArtifactStagingDirectory)client --configuration $(BuildConfiguration) --runtime win-x86 -p:PublishSingleFile=true -p:PublishTrimmed=true'
    zipAfterPublish: false
    modifyOutputPath: false
- task: MSBuild@1
  inputs:
    solution: '**/*.wixproj'
    configuration: '$(BuildConfiguration)'
    msbuildArguments: '/p:RunWixToolsOutOfProc=true'
- task: PublishBuildArtifacts@1
  displayName: 'Save artifacts'
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'
 

Результат выполнения конвейера (успешно):

 "C:Program Filesdotnetdotnet.exe" publish D:a1sMyProjectMyProject.csproj --output D:a1aclient --configuration Release --runtime win-x86 -p:PublishSingleFile=true -p:PublishTrimmed=true
 

И WIX (неудачно):

 C:Program Files (x86)WiX Toolset v3.11binLight.exe -out D:a1sMyProject.InstallerbinReleasenb-NOMyProject.Installer.msi -pdbout D:a1sMyProject.InstallerbinReleasenb-NOMyProject.Installer.wixpdb -cultures:nb-NO -ext "C:Program Files (x86)WiX Toolset v3.11bin\WixUIExtension.dll" -loc Product.nb-NO.wxl -contentsfile objReleaseMyProject.Installer.wixproj.BindContentsFileListnb-NO.txt -outputsfile objReleaseMyProject.Installer.wixproj.BindOutputsFileListnb-NO.txt -builtoutputsfile objReleaseMyProject.Installer.wixproj.BindBuiltOutputsFileListnb-NO.txt -wixprojectfile D:a1sMyProject.InstallerMyProject.Installer.wixproj objReleaseProduct.wixobj
##[error]MyProject.InstallerProduct.wxs(108,0): Error LGHT0103: The system cannot find the file 'clientMyProject.exe'.
 

Ясно, что он не может найти файл для встраивания в MSI, но я не знаю, как поступить.

Мы высоко ценим любые советы по организации проектов, выводу и настройке конвейера.

Ответ №1:

Мое текущее решение:

Репозиторий Git Azure DevOps, состоящий из одного решения с двумя проектами.

  • МиКлиент
  • МиКлиент.Установщик

Проект MyClient имеет локальный профиль публикации, который публикует результаты сборки в проекте wix. Это профиль публикации:

 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration>Release</Configuration>
    <Platform>Any CPU</Platform>
    <PublishDir>binReleasenet5.0publish</PublishDir>
    <PublishProtocol>FileSystem</PublishProtocol>
    <TargetFramework>net5.0</TargetFramework>
    <SelfContained>true</SelfContained>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <RuntimeIdentifier>win-x86</RuntimeIdentifier>
    <ProjectGuid>xxxx-xxxx-xxxx</ProjectGuid>
    <publishUrl>..MyClient.InstallerClient</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
    <PublishSingleFile>True</PublishSingleFile>
    <PublishTrimmed>False</PublishTrimmed>
  </PropertyGroup>
</Project>
 

Таким образом, я могу ссылаться на файлы при создании проекта WIX.

Мой конвейер сборки в Azure DevOps:

 trigger:
- master

pool:
  vmImage: 'windows-latest'

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

steps:

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: '**/MyClient.csproj'
    arguments: '--output $(Build.ArtifactStagingDirectory)client --configuration $(BuildConfiguration) --runtime win-x86 -p:PublishSingleFile=true -p:PublishTrimmed=true'
    zipAfterPublish: false
    modifyOutputPath: false
- task: CopyFiles@2
  inputs:
    SourceFolder: 'MyClient.Installer'
    Contents: '**'
    TargetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
  displayName: 'Save artifacts'
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'
 

Здесь я публикую файлы, а также копирую проект WIX в папку артефактов. Теперь артефакт содержит проект wix и опубликованные выходные данные, которые сохраняются в папке client так же, как это было локально.

Имея в наличии артефакт, я теперь могу создавать отдельные MSI для разных сред, добавляя преобразования конфигурации до создания MSI.