预发行版脚本
从版本 1.6.0 开始,PowerShellGet 和 PowerShell 库都支持将 1.0.0 以上的版本标记为预发行版。 在此功能之前,预发行包仅限于以 0 开头的版本。 这些功能的目标是为 SemVer v1.0.0 版本控制约定提供更好的支持,并且不会破坏 PowerShell 版本 3 及更高版本或 PowerShellGet 现有版本的向后兼容性。 本主题重点介绍特定于脚本的功能。 模块的等效功能在预发行模块版本主题中介绍。 使用这些功能,发布服务器可以将脚本标识为 2.5.0-alpha 版,随后可发布用于取代预发行版本的 2.5.0 生产就绪版。
在高级别中,预发行版脚本功的能包括:
- 将预发行版字符串后缀添加到脚本清单中的版本字符串。 当脚本发布到 PowerShell 库后,会从清单中提取此数据,用于标识预发行包。
- 获取预发行包要求将 -AllowPrerelease 标记添加到 PowerShellGet 命令 Find-Script、Install-Script、Update-Script 和 Save-Script。 如果未指定标记,则不会显示预发行包。
- Find-Script、Get-InstalledScript 显示的脚本版本,以及在 PowerShell 库中显示的脚本版本在显示时会附加预发行版字符串,如 2.5.0-alpha。
以下介绍了这些功能的详细信息。
将脚本版本标识为预发行版
PowerShellGet 对脚本的预发行版本的支持比模块更容易。 仅 PowerShellGet 支持脚本版本控制,因此添加预发行字符串不会引起兼容性问题。 要将 PowerShell 库中的脚本标识为预发行版,请将预发行后缀添加到脚本元数据中格式正确的版本字符串中。
具有预发行版本的脚本清单的示例部分如下所示:
<#PSScriptInfo
.VERSION 3.2.1-alpha12
.GUID
...
#>
要使用预发行后缀,版本字符串必须满足以下要求:
- 版本为 3 段式的 Major.Minor.Build 时,只能指定预发行后缀。 这符合 SemVer v1.0.0 的要求
- 预发行后缀是以连字符开头的字符串,并且可能包含 ASCII 字母数字 [0-9A-Za-z-]
- 此时仅支持 SemVer v1.0.0 预发行字符串,因此预发行后缀不得包含句点或 + [.+],而在 SemVer 2.0 中允许包含
- 支持的预发行版字符串的示例包括:-alpha、-alpha1、-BETA、-update20171020
预发行版本控制对排序顺序和安装文件夹的影响
使用预发行版本时,排序顺序会发生更改,这在发布到 PowerShell 库时,以及使用 PowerShellGet 命令安装脚本时非常重要。 如果两个脚本版本都具有该版本号,则排序顺序基于连字符后面的字符串部分。 因此,2.5.0-alpha 版低于 2.5.0-beta 版,而 2.5.0-beta 版低于 2.5.0-gamma 版。 如果两个脚本具有相同的版本号,并且只有一个脚本具有预发行版字符串,则不具有预发行版后缀的脚本会假定为生产就绪版本,在排序时的版本要比预发行版本高 。 例如,在比较 2.5.0 和 2.5.0-beta 版本时,2.5.0 版本会视为两者中更高的版本。
在发布到 PowerShell 库时,默认情况下,发布的脚本版本必须高于 PowerShell 库中以前发布的任何版本。 发布服务器可能会使用 2.5.0-beta 或不具有预发行版后缀的 2.5.0 更新版本 2.5.0-alpha。
使用 PowerShellGet 命令查找和获取预发行包
使用 PowerShellGet Find-Script、Install-Script、Update-Script 和 Save-Script 命令处理预发行包需要添加 -AllowPrerelease 标记。 如果已指定 -AllowPrerelease,则会包括预发行包(如存在)。 如果未指定 -AllowPrerelease 标记,则不会显示预发行包。
PowerShellGet 脚本命令中这种情况的唯一例外是 Get-InstalledScript,以及某些情况下的 Uninstall-Script。
- Get-InstalledScript 始终在版本字符串中自动显示预发行信息(如存在)。
- Uninstall-Script 在未指定任何版本时默认卸载最新版本的脚本 。 该行为尚未更改。 但是,如果预发行版本是使用
-RequiredVersion
指定的,则需要-AllowPrerelease
。
示例
# Assume the PowerShell Gallery has TestPackage versions 1.8.0 and 1.9.0-alpha.
# If -AllowPrerelease is not specified, only version 1.8.0 will be returned.
C:\windows\system32> Find-Script TestPackage
Version Name Repository Description
------- ---- ---------- -----------
1.8.0 TestPackage PSGallery Package used to validate changes to the PowerShe...
C:\windows\system32> Find-Script TestPackage -AllowPrerelease
Version Name Repository Description
------- ---- ---------- -----------
1.9.0-alpha TestPackage PSGallery Package used to validate changes to PowerShe...
# To install a prerelease, you must specify -AllowPrerelease. Specifying a prerelease version string is not sufficient.
C:\windows\system32> Install-Script TestPackage -RequiredVersion 1.9.0-alpha
PackageManagement\Find-Package : No match was found for the specified search criteria and script name 'TestPackage'.
Try Get-PSRepository to see all available registered script repositories.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.6.0\PSModule.psm1:1455 char:3
+ PackageManagement\Find-Package @PSBoundParameters | Microsoft ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Microsoft.Power...ets.FindPackage:FindPackage)[Find-Package], Exception
+ FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.FindPackage
# The previous command failed because -AllowPrerelease was not specified.
# Adding -AllowPrerelease will result in success.
C:\windows\system32> Install-Script TestPackage -RequiredVersion 1.9.0-alpha -AllowPrerelease
C:\windows\system32> Get-InstalledScript TestPackage
Version Name Repository Description
------- ---- ---------- -----------
1.9.0-alpha TestPackage PSGallery Package used to validate changes to PowerShe...
# Note that Get-InstalledScript shows the prerelease version.
# If -RequiredVersion is not specified, all installed scripts will be displayed by Get-InstalledScript
如果未提供 -RequiredVersion,Uninstall-Script 会删除最新版本的脚本。 如果已指定 -RequiredVersion,并且是预发行版,则必须将 -AllowPrerelease 添加到命令中。
C:\windows\system32> Get-InstalledScript TestPackage
Version Name Repository Description
------- ---- ---------- -----------
1.9.0-alpha TestPackage PSGallery Package used to validate changes to PowerShe...
C:\windows\system32> Uninstall-Script TestPackage -RequiredVersion 1.9.0-alpha
Uninstall-Script: The '-AllowPrerelease' parameter must be specified when using the Prerelease string in
MinimumVersion, MaximumVersion, or RequiredVersion.
At line:1 char:1
+ Uninstall-Script TestPackage -RequiredVersion 1.9.0-beta
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Uninstall-Script], ArgumentException
+ FullyQualifiedErrorId : AllowPrereleaseRequiredToUsePrereleaseStringInVersion,Uninstall-script
C:\windows\system32> Uninstall-Script TestPackage -RequiredVersion 1.9.0-alpha -AllowPrerelease
# Since script versions are not installed side-by-side, the above could be simply "Uninstall-Script TestPackage"
C:\windows\system32> Get-Installedscript TestPackage
PackageManagement\Get-Package : No match was found for the specified search criteria and script names 'testpackage'.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.5.0.0\PSModule.psm1:4088 char:9
+ PackageManagement\Get-Package @PSBoundParameters | Microsoft. ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Microsoft.Power...lets.GetPackage:GetPackage) [Get-Package], Exception
+ FullyQualifiedErrorId : NoMatchFound,Microsoft.PowerShell.PackageManagement.Cmdlets.GetPackage