Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De onderstaande tabel bevat de verschillende MSBuild-argumenten die u kunt definiëren voor het instellen van uw build-pijplijn.
| MSBuild-argument | Waarde | Beschrijving |
|---|---|---|
| AppxPackageDir | $(Build.ArtifactStagingDirectory)\AppxPackages | Hiermee definieert u de map voor het opslaan van de gegenereerde artefacten. |
| AppxBundlePlatforms | $(Build.BuildPlatform) | Hiermee kunt u de platformen definiëren die in de bundel moeten worden opgenomen. |
| AppxBundle | Altijd | Hiermee maakt u een .msixbundle/.appxbundle met de .msix/.appx bestanden voor het opgegeven platform. |
| UapAppxPackageBuildMode | StoreUpload | Hiermee genereert u het .msixupload/.appxupload-bestand en de map _Test voor sideloading. |
| UapAppxPackageBuildMode | CI | Hiermee wordt alleen het .msixupload/.appxupload-bestand gegenereerd. |
| UapAppxPackageBuildMode | SideloadOnly | Hiermee wordt de folder _Test gegenereerd voor alleen sideloading. |
| AppxPackageSigningEnabled | waar | Schakelt pakketondertekening in. |
| Pakketcertificaatthumbprint | Vingerafdruk van het certificaat | Deze waarde moet overeenkomen met de vingerafdruk in het handtekeningcertificaat of een lege tekenreeks zijn. |
| PakketCertificaatSleutelBestand | Pad | Het pad naar het te gebruiken certificaat. Dit wordt opgehaald uit de metagegevens van het beveiligde bestand. |
| Pakketcertificaatwachtwoord | Wachtwoord | Het wachtwoord voor de persoonlijke sleutel in het certificaat. U wordt aangeraden uw wachtwoord op te slaan in Azure Key Vault- en het wachtwoord te koppelen aan variabelegroep. U kunt de variabele doorgeven aan dit argument. |
Voordat u het verpakkingsproject bouwt op dezelfde manier als de wizard in Visual Studio dat doet met de MSBuild-opdrachtregel, kan het buildproces de versie van het MSIX-pakket aanpassen door het kenmerk Versie van het Package-element in het bestand Package.appxmanifest te bewerken. In Azure Pipelines kunt u dit bereiken met behulp van een expressie voor het instellen van een tellervariabele die voor elke build wordt verhoogd en een PowerShell-script dat gebruikmaakt van de klasse System.Xml.Linq.XDocument in .NET om de waarde van het kenmerk te wijzigen.
Een YAML-voorbeeldbestand dat de MSIX-buildpijplijn definieert
pool:
vmImage: windows-2019
variables:
buildPlatform: 'x86'
buildConfiguration: 'release'
major: 1
minor: 0
build: 0
revision: $[counter('rev', 0)]
steps:
- powershell: |
# Update appxmanifest. This must be done before the build.
[xml]$manifest= get-content ".\Msix\Package.appxmanifest"
$manifest.Package.Identity.Version = "$(major).$(minor).$(build).$(revision)"
$manifest.save("Msix/Package.appxmanifest")
displayName: 'Version Package Manifest'
- task: MSBuild@1
inputs:
solution: Msix/Msix.wapproj
platform: $(buildPlatform)
configuration: $(buildConfiguration)
msbuildArguments: '/p:OutputPath=NonPackagedApp
/p:UapAppxPackageBuildMode=SideLoadOnly /p:AppxBundle=Never /p:AppxPackageOutput=$(Build.ArtifactStagingDirectory)\MsixDesktopApp.msix /p:AppxPackageSigningEnabled=false'
displayName: 'Package the App'
- task: DownloadSecureFile@1
inputs:
secureFile: 'certificate.pfx'
displayName: 'Download Secure PFX File'
- script: '"C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86\signtool"
sign /fd SHA256 /f $(Agent.TempDirectory)/certificate.pfx /p secret $(
Build.ArtifactStagingDirectory)/MsixDesktopApp.msix'
displayName: 'Sign MSIX Package'
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: drop'
Hieronder ziet u uitsplitsingen van de verschillende buildtaken die zijn gedefinieerd in het YAMl-bestand:
Eigenschappen voor het genereren van pakketten configureren
Met de onderstaande definitie wordt de map met buildonderdelen, het platform ingesteld en wordt gedefinieerd of een bundel moet worden gemaakt of niet.
/p:AppxPackageDir="$(Build.ArtifactStagingDirectory)\AppxPackages\"
/p:UapAppxPackageBuildMode=SideLoadOnly
/p:AppxBundlePlatforms="$(Build.BuildPlatform)"
/p:AppxBundle=Never
Pakketondertekening configureren
Als u het MSIX-pakket (of APPX) wilt ondertekenen, moet de pijplijn het handtekeningcertificaat ophalen. Voeg hiervoor een DownloadSecureFile-taak toe voorafgaand aan de VSBuild-taak.
Hiermee hebt u toegang tot het handtekeningcertificaat via signingCert.
- task: DownloadSecureFile@1
name: signingCert
displayName: 'Download CA certificate'
inputs:
secureFile: '[Your_Pfx].pfx'
Werk vervolgens de MSBuild-taak bij om te verwijzen naar het handtekeningcertificaat:
- task: MSBuild@1
inputs:
platform: 'x86'
solution: '$(solution)'
configuration: '$(buildConfiguration)'
msbuildArgs: '/p:AppxBundlePlatforms="$(buildPlatform)"
/p:AppxPackageDir="$(appxPackageDir)"
/p:AppxBundle=Never
p:UapAppxPackageBuildMode=SideLoadOnly
/p:AppxPackageSigningEnabled=true
/p:PackageCertificateThumbprint=""
/p:PackageCertificateKeyFile="$(signingCert.secureFilePath)"'
Opmerking
Het argument PackageCertificateThumbprint is opzettelijk ingesteld op een lege tekenreeks als voorzorgsmaatregel. Als de vingerafdruk is ingesteld in het project, maar niet overeenkomt met het handtekeningcertificaat, mislukt de build met de volgende fout: Certificate does not match supplied signing thumbprint.
Parameters controleren
De parameters die zijn gedefinieerd met de $() syntaxis zijn variabelen die zijn gedefinieerd in de builddefinitie en worden gewijzigd in andere buildsystemen.
Zie Vooraf gedefinieerde buildvariabelenom alle vooraf gedefinieerde variabelen weer te geven.
De taak Build-artefacten publiceren configureren
De standaard-MSIX-pijplijn slaat de gegenereerde artefacten niet op. Als u de publicatiemogelijkheden wilt toevoegen aan uw YAML-definitie, voegt u de volgende taken toe.
- task: CopyFiles@2
displayName: 'Copy Files to: $(build.artifactstagingdirectory)'
inputs:
SourceFolder: '$(system.defaultworkingdirectory)'
Contents: '**\bin\$(BuildConfiguration)\**'
TargetFolder: '$(build.artifactstagingdirectory)'
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: drop'
inputs:
PathtoPublish: '$(build.artifactstagingdirectory)'
U kunt de gegenereerde artefacten zien in de Artifacts optie van de pagina met buildresultaten.
AppInstaller-bestand voor distributie zonder store
Als u uw toepassing buiten de Store distribueert, kunt u profiteren van het AppInstaller-bestand voor de installatie en updates van uw pakket
Een .appinstaller-bestand dat zoekt naar bijgewerkte bestanden op \server\foo
<?xml version="1.0" encoding="utf-8"?>
<AppInstaller xmlns="http://schemas.microsoft.com/appx/appinstaller/2018"
Version="1.0.0.0"
Uri="\\server\foo\MsixDesktopApp.appinstaller">
<MainPackage Name="MyCompany.MySampleApp"
Publisher="CN=MyCompany, O=MyCompany, L=Stockholm, S=N/A, C=Sweden"
Version="1.0.0.0"
Uri="\\server\foo\MsixDesktopApp.msix"
ProcessorArchitecture="x86"/>
<UpdateSettings>
<OnLaunch HoursBetweenUpdateChecks="0" />
</UpdateSettings>
</AppInstaller>
Het element UpdateSettings wordt gebruikt om het systeem te laten weten wanneer er op updates moet worden gecontroleerd en of de gebruiker gedwongen moet worden om te updaten. De volledige schemareferentie, inclusief de ondersteunde naamruimten voor elke versie van Windows 10, vindt u in de documenten op bit.ly/2TGWnCR.
Als u het .appinstaller-bestand toevoegt aan het verpakkingsproject en de eigenschap Pakketactie instelt op Inhoud en de eigenschap Kopiëren naar uitvoermap instelt op 'Kopiëren indien nieuwer', kunt u vervolgens een andere PowerShell-taak toevoegen aan het YAML-bestand dat de versiekenmerken van de root- en MainPackage-elementen bijwerkt en het bijgewerkte bestand opslaat in de voorbereidingsdirectory:
- powershell: |
[Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq")
$doc = [System.Xml.Linq.XDocument]::Load(
"$(Build.SourcesDirectory)/Msix/Package.appinstaller")
$version = "$(major).$(minor).$(build).$(revision)"
$doc.Root.Attribute("Version").Value = $version;
$xName =
[System.Xml.Linq.XName]
"{http://schemas.microsoft.com/appx/appinstaller/2018}MainPackage"
$doc.Root.Element($xName).Attribute("Version").Value = $version;
$doc.Save("$(Build.ArtifactStagingDirectory)/MsixDesktopApp.appinstaller")
displayName: 'Version App Installer File'
Vervolgens distribueert u het .appinstaller-bestand naar uw eindgebruikers en laat u ze dubbelklikken op dit bestand in plaats van op het MSIX-bestand om de verpakte app te installeren.
Doorlopende implementatie.
Het installatiebestand van de app zelf is een niet-gecompileerd XML-bestand dat kan worden bewerkt na de build, indien nodig. Dit maakt het eenvoudig om te gebruiken wanneer u uw software implementeert in meerdere omgevingen en wanneer u de build-pijplijn wilt scheiden van het releaseproces.
Als u een release-pijplijn maakt in de Azure Portal met behulp van de sjabloon "Lege taak" en de onlangs ingestelde build-pijplijn gebruikt als de bron van het artefact dat moet worden geïmplementeerd, kunt u vervolgens de PowerShell task toevoegen aan de releasefase om de waarden van de twee Uri-attributen in het .appinstaller-bestand dynamisch te wijzigen om overeen te komen met de locatie waarop de app wordt gepubliceerd.
Een releasepijplijntaak die de URI's wijzigt in het .appinstaller-bestand
- powershell: |
[Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq")
$fileShare = "\\filesharestorageccount.file.core.windows.net\myfileshare\"
$localFilePath =
"$(System.DefaultWorkingDirectory)\_MsixDesktopApp\drop\MsixDesktopApp.appinstaller"
$doc = [System.Xml.Linq.XDocument]::Load("$localFilePath")
$doc.Root.Attribute("Uri").Value = [string]::Format('{0}{1}', $fileShare,
'MsixDesktopApp.appinstaller')
$xName =
[System.Xml.Linq.XName]"{http://schemas.microsoft.com/appx/appinstaller/2018}MainPackage"
$doc.Root.Element($xName).Attribute("Uri").Value = [string]::Format('{0}{1}',
$fileShare, 'MsixDesktopApp.appx')
$doc.Save("$localFilePath")
displayName: 'Modify URIs in App Installer File'
In de bovenstaande taak wordt de URI ingesteld op het UNC-pad van een Azure-bestandsshare. Omdat hier het besturingssysteem zoekt naar het MSIX-pakket wanneer u de app installeert en bijwerkt, heb ik ook een ander opdrachtregelscript toegevoegd aan de release-pijplijn waarmee de bestandsshare in de cloud eerst wordt toegewezen aan de lokale Z:\ drive on the build agent before it uses the xcopy command to copy the .appinstaller and .msix-bestanden daar:
- script: |
net use Z: \\filesharestorageccount.file.core.windows.net\myfileshare
/u:AZURE\filesharestorageccount
3PTYC+ociHIwNgCnyg7zsWoKBxRmkEc4Aew4FMzbpUl/
dydo/3HVnl71XPe0uWxQcLddEUuq0fN8Ltcpc0LYeg==
xcopy $(System.DefaultWorkingDirectory)\_MsixDesktopApp\drop Z:\ /Y
displayName: 'Publish App Installer File and MSIX package'
Als u uw eigen on-premises Azure DevOps Server host, kunt u de bestanden natuurlijk publiceren naar uw eigen interne netwerkshare.
Als u ervoor kiest om naar een webserver te publiceren, kunt u MSBuild vertellen een bestand met een versie van .appinstaller te genereren en een HTML-pagina met een downloadkoppeling en enkele informatie over de verpakte app door een paar extra argumenten op te geven in het YAML-bestand:
- task: MSBuild@1
inputs:
solution: Msix/Msix.wapproj
platform: $(buildPlatform)
configuration: $(buildConfiguration)
msbuildArguments: '/p:OutputPath=NonPackagedApp /p:UapAppxPackageBuildMode=SideLoadOnly /p:AppxBundle=Never /p:GenerateAppInstallerFile=True
/p:AppInstallerUri=http://yourwebsite.com/packages/ /p:AppInstallerCheckForUpdateFrequency=OnApplicationRun /p:AppInstallerUpdateFrequency=1 /p:AppxPackageDir=$(Build.ArtifactStagingDirectory)/'
displayName: 'Package the App'
Het gegenereerde HTML-bestand bevat een hyperlink met het browser-agnostic ms-appinstaller-protocolactiveringsschema.
<a href="ms-appinstaller:?source=
http://yourwebsite.com/packages/Msix_x86.appinstaller ">Install App</a>
Als u een release-pijplijn instelt waarmee de inhoud van de vervolgkeuzelijst naar uw intranet of een andere website wordt gepubliceerd, en de webserver bytebereikaanvragen ondersteunt en correct is geconfigureerd, kunnen uw eindgebruikers deze koppeling gebruiken om de app rechtstreeks te installeren zonder eerst het MSIX-pakket te downloaden.
Opmerking
De mogelijkheid om het ms-appinstaller URI-schema (Uniform Resource Identifier) (protocol) te gebruiken, kan worden beheerd door een IT-professional (een beheerder). Als u ms-appinstaller wilt inschakelen in uw netwerk, stelt u het groepsbeleid EnableMSAppInstallerProtocol (/windows/client-management/mdm/policy-csp-desktopappinstaller) in op ingeschakeld (zie Beleids-CSP - DesktopAppInstaller). Zie Windows 10-apps installeren vanaf een webpagina voor meer informatie.