Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W poniższej tabeli wymieniono różne argumenty MSBuild, które można zdefiniować w celu skonfigurowania potoku kompilacji.
| argumentu MSBuild | Wartość | Opis |
|---|---|---|
| AppxPackageDir | $(Build.ArtifactStagingDirectory)\AppxPackages | Definiuje folder do przechowywania wygenerowanych artefaktów. |
| AppxBundlePlatforms | $(Build.BuildPlatform) | Umożliwia zdefiniowanie platform do uwzględnienia w pakiecie. |
| AppxBundle | Zawsze | Tworzy plik msixbundle/.appxbundle z plikami msix/.appx dla określonej platformy. |
| UapAppxPackageBuildMode | StoreUpload | Generuje plik .msixupload/.appxupload i folder _Test do zainstalowania zewnętrznego. |
| UapAppxPackageBuildMode | CI (Ciągła integracja) | Generuje tylko plik .msixupload/.appxupload. |
| UapAppxPackageBuildMode | Tylko ładowanie bezpośrednie | Generuje folder _Test tylko do ładowania zewnętrznego. |
| AppxPackageSigningEnabled | prawda | Włącza podpisywanie pakietów. |
| Odcisk palca certyfikatu pakietu | Odcisk palca certyfikatu | Ta wartość musi być zgodna z odciskiem palca w certyfikacie podpisywania lub być pustym ciągiem. |
| PlikKluczaCertyfikatuPaczki | Ścieżka | Ścieżka do certyfikatu do użycia. Jest to pobierane z bezpiecznych metadanych pliku. |
| HasłoCertyfikatuPaczki | Hasło | Hasło klucza prywatnego w certyfikacie. Zalecamy przechowywanie hasła w usłudze Azure Key Vault i łączenie hasła z grupą zmiennych. Zmienną można przekazać do tego argumentu. |
Przed zbudowaniem projektu pakietowania w taki sam sposób, jak robi to kreator w Visual Studio przy użyciu wiersza polecenia MSBuild, proces kompilacji może zmienić wersję pakietu MSIX, który jest tworzony, poprzez edytowanie atrybutu Version elementu Package w pliku Package.appxmanifest. W usłudze Azure Pipelines można to osiągnąć za pomocą wyrażenia służącego do ustawiania zmiennej licznika, która jest zwiększana dla każdej kompilacji, oraz skryptu programu PowerShell używającego klasy System.Xml.Linq.XDocument na platformie .NET w celu zmiany wartości atrybutu.
Przykładowy plik YAML definiujący potok kompilacji MSIX
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'
Poniżej przedstawiono podziały różnych zadań kompilacji zdefiniowanych w pliku YAMl:
Konfigurowanie właściwości generowania pakietów
Poniższa definicja określa katalog składników kompilacji, platformę i określa, czy utworzyć pakiet, czy nie.
/p:AppxPackageDir="$(Build.ArtifactStagingDirectory)\AppxPackages\"
/p:UapAppxPackageBuildMode=SideLoadOnly
/p:AppxBundlePlatforms="$(Build.BuildPlatform)"
/p:AppxBundle=Never
Konfigurowanie podpisywania pakietu
Aby podpisać pakiet MSIX (lub APPX), potok musi pobrać certyfikat podpisywania. W tym celu dodaj zadanie DownloadSecureFile przed zadaniem programu VSBuild.
Zapewni to dostęp do certyfikatu podpisywania za pośrednictwem signingCert.
- task: DownloadSecureFile@1
name: signingCert
displayName: 'Download CA certificate'
inputs:
secureFile: '[Your_Pfx].pfx'
Następnie zaktualizuj zadanie MSBuild, aby odwoływać się do certyfikatu podpisywania:
- 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)"'
Uwaga / Notatka
Argument PackageCertificateThumbprint jest celowo ustawiony na pusty ciąg jako środek ostrożności. Jeśli odcisk palca jest ustawiony w projekcie, ale nie jest zgodny z certyfikatem podpisywania, kompilacja zakończy się niepowodzeniem z powodu błędu: Certificate does not match supplied signing thumbprint.
Przegląd parametrów
Parametry zdefiniowane za pomocą składni $() są zmiennymi zdefiniowanymi w definicji kompilacji i zmienią się w innych systemach kompilacji.
Aby wyświetlić wszystkie wstępnie zdefiniowane zmienne, zobacz wstępnie zdefiniowane zmienne kompilacji.
Skonfiguruj zadanie Publikowanie artefaktów kompilacji
Domyślny potok MSIX nie zapisuje wygenerowanych artefaktów. Aby dodać możliwości publikowania do definicji YAML, dodaj następujące zadania.
- 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)'
Na stronie wyników kompilacji możesz zobaczyć wygenerowane artefakty w opcji Artefakty.
Plik AppInstaller dla dystrybucji niezwiązanej z magazynem
Jeśli dystrybuujesz aplikację poza sklepem, możesz skorzystać z pliku AppInstaller na potrzeby instalacji i aktualizacji pakietu
Plik .appinstaller, który będzie szukać zaktualizowanych plików w \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>
Element UpdateSettings służy do określania, kiedy system ma sprawdzać dostępność aktualizacji i czy wymusić na użytkowniku aktualizację. Pełne odwołanie do schematu, w tym obsługiwane przestrzenie nazw dla każdej wersji systemu Windows 10, można znaleźć w dokumentacji w bit.ly/2TGWnCR.
Jeśli dodasz plik .appinstaller do projektu pakowania i ustawisz jego właściwość Akcja pakietu na Zawartość oraz właściwość Kopiuj do katalogu wyjściowego na Kopiuj, jeśli nowszy, możesz wtedy dodać kolejne zadanie w PowerShell do pliku YAML, które aktualizuje atrybuty wersji elementów root i MainPackage oraz zapisuje zaktualizowany plik w katalogu przejściowym.
- 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'
Następnie należy rozpowszechnić plik .appinstaller do użytkowników końcowych i umożliwić im dwukrotne kliknięcie tego pliku zamiast pliku msix w celu zainstalowania spakowanej aplikacji.
Ciągłe wdrażanie
Sam plik instalatora aplikacji jest niekompilowanym plikiem XML, który można edytować po kompilacji, jeśli jest to wymagane. Ułatwia to wdrażanie oprogramowania w wielu środowiskach i oddzielenie potoku kompilacji od procesu wydawania.
Jeśli utworzysz potok wydania w Azure Portal za pomocą szablonu „Puste zadanie” i jako źródło artefaktu do wdrożenia użyjesz ostatnio skonfigurowanego potoku kompilacji, możesz następnie dodać zadanie PowerShell do etapu wydania, aby dynamicznie zmieniać wartości dwóch atrybutów identyfikatora URI w pliku .appinstaller, tak by odzwierciedlały lokalizację, w której opublikowano aplikację.
Zadanie potoku wydania, które modyfikuje URI w pliku .appinstaller
- 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'
W powyższym zadaniu identyfikator URI jest ustawiony na ścieżkę UNC udziału plików w usłudze Azure. Ponieważ w tym miejscu system operacyjny będzie szukać pakietu MSIX podczas instalowania i aktualizowania aplikacji, dodałem również inny skrypt wiersza polecenia do ciągu wydań, który najpierw mapuje zasób udostępniony w chmurze na lokalne pliki Z:\ drive on the build agent before it uses the xcopy command to copy the .appinstaller and .msix:
- 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'
Jeśli hostujesz własny lokalny serwer Azure DevOps Server, możesz oczywiście opublikować pliki we własnym udziale sieci wewnętrznej.
Jeśli zdecydujesz się opublikować na serwerze sieci Web, możesz poinformować program MSBuild, aby wygenerował plik appinstaller w wersji i stronę HTML zawierającą link pobierania oraz niektóre informacje o spakowanej aplikacji, podając kilka dodatkowych argumentów w pliku YAML:
- 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'
Wygenerowany plik HTML zawiera hiperlink poprzedzony schematem aktywacji protokołu ms-appinstaller, który działa niezależnie od przeglądarki.
<a href="ms-appinstaller:?source=
http://yourwebsite.com/packages/Msix_x86.appinstaller ">Install App</a>
Jeśli skonfigurujesz potok wdrożeniowy, który publikuje zawartość katalogu wyjściowego w intranecie lub innej stronie internetowej, a serwer internetowy obsługuje żądania zakresu bajtów i jest prawidłowo skonfigurowany, użytkownicy końcowi mogą użyć tego linku, aby bezpośrednio zainstalować aplikację bez wcześniejszego pobrania pakietu MSIX.
Uwaga / Notatka
Możliwość używania schematu identyfikatora URI (uniform Resource Identifier) ms-appinstaller (protokołu) może być kontrolowana przez specjalistę IT (administratora). Aby włączyć ms-appinstaller w sieci, ustaw w zasadach grupy protokół EnableMSAppInstallerProtocol (/windows/client-management/mdm/policy-csp-desktopappinstaller) na włączony (zobacz Dostawca usługi konfiguracji zasad — DesktopAppInstaller). Aby uzyskać więcej informacji, zobacz Instalowanie aplikacji systemu Windows 10 ze strony internetowej.