PowerShell モジュールのバージョン管理

psm1 ファイルではバージョンを指定する方法がないのでインポートするとバージョンが 0.0 になります。

> Import-Module .\Modules\Greeting\Greeting.psm1
> Get-Module Greeting

ModuleType Version Name
---------- ------- ----
Script     0.0     Greeting

バージョンを管理するためにはマニフェストファイル(psd1)を用意する必要があります。マニフェストファイルのテンプレートは New-ModuleManifest で作成することができます。psd1 は psm1 と同じ階層に出力します。

New-ModuleManifest -Path .\Modules\Greeting\Greeting.psd1 -Author tamtamyarn -RootModule Greeting.psm1 -ModuleVersion 1.0.0

出力されたテンプレートは以下のようになります。

#
# モジュール 'Greeting' のモジュール マニフェスト
#
# 生成者: tamtamyarn
#
# 生成日: 2021/12/19
#

@{

# このマニフェストに関連付けられているスクリプト モジュール ファイルまたはバイナリ モジュール ファイル。
RootModule = 'Greeting.psm1'

# このモジュールのバージョン番号です。
ModuleVersion = '1.0.0'

# サポートされている PSEditions
# CompatiblePSEditions = @()

# このモジュールを一意に識別するために使用される ID
GUID = '586ac6fe-8f39-465c-bb0d-0bec9cac6ca7'

# このモジュールの作成者
Author = 'tamtamyarn'

# このモジュールの会社またはベンダー
CompanyName = '不明'

# このモジュールの著作権情報
Copyright = '(c) 2021 tamtamyarn. All rights reserved.'

# このモジュールの機能の説明
# Description = ''

# このモジュールに必要な Windows PowerShell エンジンの最小バージョン
# PowerShellVersion = ''

# このモジュールに必要な Windows PowerShell ホストの名前
# PowerShellHostName = ''

# このモジュールに必要な Windows PowerShell ホストの最小バージョン
# PowerShellHostVersion = ''

# このモジュールに必要な Microsoft .NET Framework の最小バージョン。 この前提条件は、PowerShell Desktop エディションについてのみ有効です。
# DotNetFrameworkVersion = ''

# このモジュールに必要な共通言語ランタイム (CLR) の最小バージョン。 この前提条件は、PowerShell Desktop エディションについてのみ有効です。
# CLRVersion = ''

# このモジュールに必要なプロセッサ アーキテクチャ (なし、X86、Amd64)
# ProcessorArchitecture = ''

# このモジュールをインポートする前にグローバル環境にインポートされている必要があるモジュール
# RequiredModules = @()

# このモジュールをインポートする前に読み込まれている必要があるアセンブリ
# RequiredAssemblies = @()

# このモジュールをインポートする前に呼び出し元の環境で実行されるスクリプト ファイル (.ps1)。
# ScriptsToProcess = @()

# このモジュールをインポートするときに読み込まれる型ファイル (.ps1xml)
# TypesToProcess = @()

# このモジュールをインポートするときに読み込まれる書式ファイル (.ps1xml)
# FormatsToProcess = @()

# RootModule/ModuleToProcess に指定されているモジュールの入れ子になったモジュールとしてインポートするモジュール
# NestedModules = @()

# このモジュールからエクスポートする関数です。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートする関数がない場合は、エントリを削除しないで空の配列を使用してください。
FunctionsToExport = '*'

# このモジュールからエクスポートするコマンドレットです。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートするコマンドレットがない場合は、エントリを削除しないで空の配列を使用してください。
CmdletsToExport = '*'

# このモジュールからエクスポートする変数
VariablesToExport = '*'

# このモジュールからエクスポートするエイリアスです。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートするエイリアスがない場合は、エントリを削除しないで空の配列を使用してください。
AliasesToExport = '*'

# このモジュールからエクスポートする DSC リソース
# DscResourcesToExport = @()

# このモジュールに同梱されているすべてのモジュールのリスト
# ModuleList = @()

# このモジュールに同梱されているすべてのファイルのリスト
# FileList = @()

# RootModule/ModuleToProcess に指定されているモジュールに渡すプライベート データ。これには、PowerShell で使用される追加のモジュール メタデータを含む PSData ハッシュテーブルが含まれる場合もあります。
PrivateData = @{

    PSData = @{

        # このモジュールに適用されているタグ。オンライン ギャラリーでモジュールを検出する際に役立ちます。
        # Tags = @()

        # このモジュールのライセンスの URL。
        # LicenseUri = ''

        # このプロジェクトのメイン Web サイトの URL。
        # ProjectUri = ''

        # このモジュールを表すアイコンの URL。
        # IconUri = ''

        # このモジュールの ReleaseNotes
        # ReleaseNotes = ''

    } # PSData ハッシュテーブル終了

} # PrivateData ハッシュテーブル終了

# このモジュールの HelpInfo URI
# HelpInfoURI = ''

# このモジュールからエクスポートされたコマンドの既定のプレフィックス。既定のプレフィックスをオーバーライドする場合は、Import-Module -Prefix を使用します。
# DefaultCommandPrefix = ''

}

項目が多くてごちゃごちゃしているので最低限の要素以外は削除します。

@{

# このマニフェストに関連付けられているスクリプト モジュール ファイルまたはバイナリ モジュール ファイル。
RootModule = 'Greeting.psm1'

# このモジュールのバージョン番号です。
ModuleVersion = '1.0.0'

# このモジュールを一意に識別するために使用される ID
GUID = '586ac6fe-8f39-465c-bb0d-0bec9cac6ca7'

# このモジュールからエクスポートする関数です。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートする関数がない場合は、エントリを削除しないで空の配列を使用してください。
FunctionsToExport = '*'

# このモジュールからエクスポートするコマンドレットです。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートするコマンドレットがない場合は、エントリを削除しないで空の配列を使用してください。
CmdletsToExport = '*'

# このモジュールからエクスポートする変数
VariablesToExport = '*'

# このモジュールからエクスポートするエイリアスです。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートするエイリアスがない場合は、エントリを削除しないで空の配列を使用してください。
AliasesToExport = '*'

}

これでモジュールをインポートすると指定したバージョンで読み込まれます。

> Import-Module .\Modules\Greeting
> Get-Module Greeting

ModuleType Version Name
---------- ------- ----
Script     1.0.0   Greeting

Import-Module 実行時にバージョン指定することで特定のバージョンのモジュールをインポートすることができます。まずバージョンごとにフォルダを分けます。

│   Main.ps1
│
└───Modules
    └───Greeting
        ├───1.0.0
        │       Greeting.psd1
        │       Greeting.psm1
        │
        └───2.0.0
                Greeting.psd1
                Greeting.psm1

psd1 ファイル内の ModuleVersion をフォルダー名のバージョンと合わせておきます。RequiredVersion で指定したバージョンを読み込むことができます。指定しない場合は最新バージョンが読み込まれます。

> Remove-Module Greeting
> Import-Module .\Modules\Greeting -RequiredVersion 1.0.0
> Get-Module Greeting

ModuleType Version Name
---------- ------- ----
Script     1.0.0   Greeting

> Remove-Module Greeting
> Import-Module .\Modules\Greeting -RequiredVersion 2.0.0
> Get-Module Greeting

ModuleType Version Name
---------- ------- ----
Script     2.0.0   Greeting

> Remove-Module Greeting
> Import-Module .\Modules\Greeting
> Get-Module Greeting

ModuleType Version Name
---------- ------- ----
Script     2.0.0   Greeting