Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Tabellen nedan visar de olika MSBuild-argument som du kan definiera för att konfigurera bygg-pipelinen.
| MSBuild-argument | Värde | Beskrivning |
|---|---|---|
| AppxPackageDir | $(Build.ArtifactStagingDirectory)\AppxPackages | Definierar mappen för att lagra de genererade artefakterna. |
| AppxBundlePlatforms | $(Build.BuildPlatform) | Gör att du kan definiera de plattformar som ska ingå i paketet. |
| AppxBundle | Alltid | Skapar en .msixbundle/.appxbundle med .msix/.appx-filerna för den angivna plattformen. |
| UapAppxPackageBuildMode | StoreUpload | Genererar filen .msixupload/.appxupload och mappen _Test för sidoöverföring. |
| UapAppxPackageBuildMode | CI (Kontinuerlig integration) | Genererar endast filen .msixupload/.appxupload. |
| UapAppxPackageBuildMode | SideloadOnly | Genererar mappen _Test endast för sidoöverföring. |
| AppxPaketsigneringAktiverad | sann | Aktiverar paketsignering. |
| Paketcertifikatthumbprint | Certifikatets tumavtryck | Det här värdet måste matcha tumavtrycket i signeringscertifikatet eller vara en tom sträng. |
| Paketcertifikatnyckelfil | Väg | Sökvägen till certifikatet som ska användas. Detta hämtas från de säkra filmetadata. |
| Paketcertifikatlösenord | Lösenord | Lösenordet för den privata nyckeln i certifikatet. Vi rekommenderar att du lagrar ditt lösenord i Azure Key Vault- och länkar lösenordet till variabelgrupp. Du kan skicka variabeln till det här argumentet. |
Innan du skapar paketeringsprojektet på samma sätt som guiden i Visual Studio använder kommandoraden MSBuild kan byggprocessen versionföra MSIX-paketet som skapas genom att redigera versionsattributet för paketelementet i filen Package.appxmanifest. I Azure Pipelines kan detta uppnås genom att använda ett uttryck för att ange en räknarvariabel som ökar för varje version och ett PowerShell-skript som använder klassen System.Xml.Linq.XDocument i .NET för att ändra värdet för attributet.
Exempel på YAML-fil som definierar MSIX Build Pipeline
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'
Nedan visas uppdelningar av de olika build-uppgifter som definierats i YAMl-filen:
Konfigurera egenskaper för paketgenerering
Definitionen nedan anger katalogen för Build-komponenter, plattformen och definierar om du vill skapa ett paket eller inte.
/p:AppxPackageDir="$(Build.ArtifactStagingDirectory)\AppxPackages\"
/p:UapAppxPackageBuildMode=SideLoadOnly
/p:AppxBundlePlatforms="$(Build.BuildPlatform)"
/p:AppxBundle=Never
Konfigurera paketsignering
Om du vill signera MSIX-paketet (eller APPX) måste pipelinen hämta signeringscertifikatet. Det gör du genom att lägga till en DownloadSecureFile-uppgift före VSBuild-aktiviteten.
Detta ger dig åtkomst till signeringscertifikatet via signingCert.
- task: DownloadSecureFile@1
name: signingCert
displayName: 'Download CA certificate'
inputs:
secureFile: '[Your_Pfx].pfx'
Uppdatera sedan MSBuild-uppgiften för att referera till signeringscertifikatet:
- 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)"'
Anmärkning
Argumentet PackageCertificateThumbprint är avsiktligt inställt på en tom sträng som en försiktighetsåtgärd. Om tumavtrycket anges i projektet men inte matchar signeringscertifikatet misslyckas kompileringen med felet: Certificate does not match supplied signing thumbprint.
Granska parametrar
Parametrarna som definieras med $() syntax är variabler som definieras i versionsdefinitionen och ändras i andra byggsystem.
För att se alla fördefinierade variabler, se Fördefinierade byggvariabler.
Konfigurera uppgiften Publicera artefakter från byggprocessen
Standard-MSIX-pipelinen sparar inte de genererade artefakterna. Lägg till följande uppgifter för att lägga till publiceringsfunktionerna i YAML-definitionen.
- 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)'
Du kan se de genererade artefakterna i alternativet Artifacts på sidan med byggresultat.
AppInstaller-fil för distribution utanför butiken
Om du distribuerar ditt program utanför Store kan du dra nytta av AppInstaller-filen för paketinstallationen och uppdateringarna
En .appinstaller-fil som söker efter uppdaterade filer på \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>
UpdateSettings-elementet används för att informera systemet när uppdateringar ska kontrolleras och om användaren tvingas att uppdatera. Den fullständiga schemareferensen, inklusive de namnområden som stöds för varje version av Windows 10, finns i dokumenten på bit.ly/2TGWnCR.
Om du lägger till .appinstaller-filen i paketeringsprojektet och ställer in dess paketåtgärdsegenskap till Innehåll och egenskapen Kopiera till utdatakatalog till Kopiera om nyare, kan du sedan lägga till en annan PowerShell-uppgift i YAML-filen som uppdaterar versionsattributen för rot- och MainPackage-elementen och sparar den uppdaterade filen i mellanlagringskatalogen:
- 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'
Sedan distribuerar du .appinstaller-filen till dina slutanvändare och låter dem dubbelklicka på den här filen i stället för msix-filen för att installera den paketerade appen.
Kontinuerlig distribution
Själva appinstallationsfilen är en okompilerad XML-fil som kan redigeras efter bygget, om det behövs. Det gör det enkelt att använda när du distribuerar programvaran till flera miljöer och när du vill separera bygg-pipelinen från lanseringsprocessen.
Om du skapar en versionspipeline i Azure-portalen med hjälp av mallen "Tomt jobb" och använder den nyligen konfigurerade bygg-pipelinen som källa för artefakten som ska distribueras, kan du sedan lägga till PowerShell-aktiviteten i versionssteget för att dynamiskt ändra värdena för de två Uri-attributen i .appinstaller-filen för att återspegla den plats där appen publiceras.
En versionspipelineaktivitet som ändrar Uris i .appinstaller-filen
- 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'
I uppgiften ovan är URI:n inställd till UNC-sökvägen för en Azure-fildelningsresurs. Eftersom det är här operativsystemet letar efter MSIX-paketet när du installerar och uppdaterar appen, har jag också lagt till ett annat kommandoradsskript till versionspipelinen som först mappar filresursdelningen i molnet till de lokala Z:\ drive on the build agent before it uses the xcopy command to copy the .appinstaller and .msix-filerna där:
- 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'
Om du är värd för din egen lokala Azure DevOps Server kan du naturligtvis publicera filerna till din egen interna nätverksresurs.
Om du väljer att publicera till en webbserver kan du be MSBuild att generera en version av .appinstaller-filen och en HTML-sida som innehåller en nedladdningslänk och viss information om den paketerade appen genom att ange några ytterligare argument i YAML-filen:
- 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'
Den genererade HTML-filen innehåller en hyperlänk som är prefixad med det webbläsaroberoende ms-appinstaller-protokollets aktiveringsschema.
<a href="ms-appinstaller:?source=
http://yourwebsite.com/packages/Msix_x86.appinstaller ">Install App</a>
Om du konfigurerar en versionspipeline som publicerar innehållet i mappen drop till intranätet eller någon annan webbplats, och webbservern stöder byteintervallbegäranden och är korrekt konfigurerad, kan slutanvändarna använda den här länken för att installera appen direkt utan att ladda ned MSIX-paketet först.
Anmärkning
Möjligheten att använda ms-appinstaller URI(Uniform Resource Identifier)-schemat (protokoll) kan styras av en IT-tekniker (administratör). Om du vill aktivera ms-appinstaller i nätverket anger du grupprincipen EnableMSAppInstallerProtocol (/windows/client-management/mdm/policy-csp-desktopappinstaller) till aktiverad (se CSP-princip – DesktopAppInstaller). Mer information finns i Installera Windows 10-appar från en webbsida.