命名って難しい

変数、関数、クラスなどなど実装より命名に毎回悩むタイプの人間による技術についてのメモ。

PowerShellで作ったモジュール(psm1)をプライベートなリポジトリに発行して開発チームで共用する

今日はPowerShellを。

1つの処理の流れで複数のスクリプト(ps1)で共通して使う処理をモジュール (psm1)にまとめて実装することがあります。

それらのモジュールは公開されたPowerShell Galleryに発行することで、Install-Moduleコマンドを使って、世界中で使ってもらうことができます。

www.powershellgallery.com

しかし、開発チームなどだけで共有したい場合、どのように共有すればいいだろう、というのが今回の記事の発端です。

調べたこと

プライベートでのPowerShellリポジトリ(ローカルリポジトリ)

docs.microsoft.com

リポジトリを作る方法が2つある

  • NuGet サーバーを立てる
  • ファイル共有で行う

私は手軽にやりたいので「ファイル共有」を選択

ファイル共有でのローカルリポジトリの作り方

共有フォルダの作成

準備として、フォルダを作り共有します。

GUIからフォルダのプロパティで共有してもよいですが、私はローカルリポジトリ用のサーバーの入れ替えの時に手作業するのが嫌なので、New-SmbShare コマンド を利用してセットアップ用のスクリプトを作りました。(権限はサンプルなので適当です)

$RepoName = "MyPSRepo"
$repoDir  = mkdir "C:\Public\$RepoName"
New-SmbShare -Name $RepoName -Path $repoDir.FullName -FullAccess "Everyone" 

リポジトリの登録(各メンバーに必要)

Register-PSRepository コマンド を利用して共有フォルダをリポジトリとして登録します。

Register-PSRepository -Name MyPSRepo -SourceLocation '\\RepoServer\MyPSRepo\' -ScriptSourceLocation '\\RepoServer\MyPSRepo\' -InstallationPolicy Trusted

以上です。

これだけでリポジトリサーバーができました。

モジュールの発行

Publish-Module

Publish-Module コマンド を利用してモジュールを共有フォルダに発行します。

Publish-Module -Path C:\DEV\PS\MyModule -Repository MyPSRepo -NuGetApiKey "nanndemoii"

コマンドが問題なく実行されれば、共有フォルダに .nupkg のファイルが追加されています。

psd1ファイルについては New-ModuleManifest コマンド を参照してください。

Publish-Moduleする時の注意点

私がかなり引っかかったのがコレです。

気をつけるべきは

Publish-ModulePath 引数を使って発行する時、モジュールファイルを格納しているフォルダはモジュール名と同じにすること

です。

これは私のフォルダ構成が以下のようにしていたために起こりました。

MyModule
  - Src
      - MyModule.psm1
      - MyModule.psd1
  - Test
      - MyModule.Tests.ps1

このまま Publish-Module するとエラー終了します。

Publish-Module : パス '*******' で指定されたモジュールは、そのパスの有効なモジュールが見つからなかったため、発行されませんでした。

結果、フォルダ構成を下記のように修正して対応しました。

MyModule
    - MyModule.psm1
    - MyModule.psd1
    - MyModule.Tests.ps1

テストも New-Fixture すれば同じフォルダに Tests.ps1 ファイルが生成されるし、それに沿うように無理にフォルダ分けをしないようにしました。

モジュールのインストール

Install-Module

リポジトリの登録で登録したリポジトリ名を指定して、 Install-Module を実行します。

# 例:MyModule  というモジュールを使いたい
Install-Module -Name MyModule  -Repository MyPSRepo -Scope CurrentUser

利用したいスクリプトの中でモジュールの参照

そのモジュールを利用したいスクリプトの中で、 using module を記述します。

using module MyModule

# 例:Invoke-MyCommand というコマンドを使いたい
Invoke-MyCommand 

まとめ&感想

まとめ

  • 共有フォルダに配置するのであればPowerShellのモジュール共有は割りと簡単
  • Publish-Moduleの時のソースコードのフォルダ構成に注意

感想

一連の処理の中で共有する処理のモジュールしか作ってこなかったので、今回調べたことで社内で共通した処理としてのモジュールが使えるようになり、効率化(というか何度も同じこと実装しない)が実現できそう。

とにかく、今は社内で点在しまくってる同じような処理をまとめて共通化していくことで処理のスリム化していくことが大事だからこれをプッシュしていく。

以上!