#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.