既に各所で報じられ日本語情報も多いですが、思っていた以上にニュースになっている様なので本ブログでもとりあげてみます。
公式情報
細かい話についてはPowerShell Teamのこちらのブログエントリをご覧ください。
Snapsについて
Snapsの公式サイトはコチラ。
Wikipediaによれば、
Snappyとはカノニカルが設計・開発したソフトウェアデプロイメントシステムかつパッケージ管理システムであり、元々はUbuntu Phoneオペレーティングシステム用に設計・開発された。
Snappyのパッケージは 'Snap' と呼ばれ、Snapを使うツールは 'Snapd' と呼ばれる。Snapは様々なLinuxディストリビューションで動作するので、ディストリビューションの上流のソフトウェアデプロイメントに依存しない。Snappyのシステムは携帯電話、クラウド、IoTやデスクトップパソコン向けに設計されている。
とあり、ディストリビューションに依存しない新しいパッケージマネージャーだそうです。
正直アーキテクチャなどでわからない部分は多いのですが、ざっと試した限りだとMicrosoft StoreとDesktop Bridgeの組み合わせに近い様に感じました。
(実際この例えが適切なのかは自信がありません...)
また、呼称について、今はSnappyでなくSnapsと呼ばれている?*1様です。
このあたりの事情については調べてみてもあまり情報を得ることができませんでした...
インストール方法
実際にSnapパッケージをインストールする手順を紹介します。
1. snapdのインストール
最初にsnapdをインストールする必要があります。
に各ディストリビューション毎のインストール手順が紹介されています。
おおむね各パッケージマネージャーからのインストールに対応している様です。
今回はUbuntu 18.04の環境で動作確認をしたため、デフォルトでsnapdがインストール済みでありこの手順を行うことはありませんでした。
2. PowerShell Coreのインストール
Snapパッケージの管理はsnap
コマンドから行います。
以下の様に--classic
オプションを付けてsnap install
コマンドを実行します。
# Stableバージョンのインストール snap install powershell --classic # Previewバージョンのインストール snap install powershell-preview --classic
Ubuntu 18.04の環境で試すと下図の様になります。
インストール時だけルート権限を要求されます。
インストールが終わるとこんな感じです。
現時点でUbuntu 18.04向けのdebパッケージが提供されていないPowerShell Core 6.0.3ですが、Snapパッケージであればこの様にインストール可能です。
なお、--classic
パラメーターを付けないとエラーとなります。
# --classic無しだとエラー ~$ snap install powershell error: This revision of snap "powershell" was published using classic confinement and thus may perform arbitrary system changes outside of the security sandbox that snaps are usually confined to, which may put your system at risk. If you understand and want to proceed repeat the command including --classic.
この--classic
パラメーターは、classic confinement policyと呼ばれる方式で公開されたアプリケーションをインストールするのに必要なパラメーターです。
Snapパッケージはデフォルトでファイルパスなどが分離された環境で動作する方式(strict confinement policy)となっているのですが、classic confinement policyではファイルシステムのルートが/
になる等システム全体へのアクセスが許可されたモードになるそうです。
PowerShell Coreはシェルとしてシステム全体にアクセスする必要があるためclassic confinement policyで公開されています。
confinement policyについては
に詳しい説明があります。
従来のパッケージについて
最初のPowerShell Team Blogに記載されていますが、Snapパッケージが提供されたからといって従来のパッケージマネージャー向けのパッケージの提供を止めるといった事は無いそうです。
PowerShellを利用するための選択肢を増やし、利用者がより簡易にアプリケーションを管理できる様にするためのサポートといったところの様です。
設定情報など
最後に補足としてSnapパッケージとしてインストールされたPowerShell Coreの情報を幾つかか確認して終わりにします。
検証環境
先ほどと同じUbuntu 18.04の環境です。
パス情報
実行バイナリであるpwsh
は/snap/bin/pwsh
にありました。
~$ which pwsh /snap/bin/pwsh
環境変数
PowerShell Coreを起動した後に見える環境変数には、以下の様にSNAP_
で始まるSnapパッケージ情報を持つものが追加されています。
PS /> dir env:\SNAP* Name Value ---- ----- SNAP_USER_DATA /home/shiba/snap/powershell/7 SNAP /snap/powershell/7 SNAP_REEXEC SNAP_NAME powershell SNAP_VERSION 6.0.3 SNAP_COOKIE HkSK6dTCpnVqHy4D9fY3WbPWwK1GdMmgC1rYHpnn076t SNAP_ARCH amd64 SNAP_DATA /var/snap/powershell/7 SNAP_COMMON /var/snap/powershell/common SNAP_CONTEXT HkSK6dTCpnVqHy4D9fY3WbPWwK1GdMmgC1rYHpnn076t SNAP_REVISION 7 SNAP_USER_COMMON /home/shiba/snap/powershell/common SNAP_LIBRARY_PATH /var/lib/snapd/lib/gl:/var/lib/snapd/lib/gl32:/var/lib/snapd/void
PATH絡みの環境変数はこんな感じ。
PS /> $env:PATH -split ':' /snap/powershell/7/opt/powershell /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /snap/bin PS /> $env:PSModulePath -split ':' /home/shiba/.local/share/powershell/Modules /usr/local/share/powershell/Modules /snap/powershell/7/opt/powershell/Modules
PowerShell Coreの実体は/snap/powershell/[パッケージのバージョン番号]/opt/
配下にあり、モジュールパスは他のパッケージ版と同じになっています。
/snap/powershell/配下の構成
treeコマンドで/snap/powershell/
配下を確認するとこんな感じでした。
必要なライブラリなどがバージョンごとに分離された環境にまとめられていることがわかります。
~$ sudo tree -d -L 5 /snap/powershell/ /snap/powershell/ ├── 7 │ ├── etc │ │ ├── gss │ │ │ └── mech.d │ │ └── ldap │ ├── lib │ │ └── x86_64-linux-gnu │ ├── meta │ │ └── gui │ ├── opt │ │ └── powershell │ │ ├── Modules │ │ │ ├── Microsoft.PowerShell.Archive │ │ │ ├── Microsoft.PowerShell.Host │ │ │ ├── Microsoft.PowerShell.Management │ │ │ ├── Microsoft.PowerShell.Security │ │ │ ├── Microsoft.PowerShell.Utility │ │ │ ├── PSDesiredStateConfiguration │ │ │ ├── PSReadLine │ │ │ ├── PackageManagement │ │ │ └── PowerShellGet │ │ ├── en-US │ │ │ │ │ (├── ※ pwsh はココ) │ │ │ │ │ └── ref │ ├── snap │ │ └── gui │ └── usr │ ├── lib │ │ ├── sasl2 │ │ └── x86_64-linux-gnu │ │ ├── krb5 │ │ ├── openssl-1.0.0 │ │ └── sasl2 │ └── share │ ├── doc │ │ ├── libasn1-8-heimdal │ │ │ │ ・・・ (中略) ・・・ │ │ │ │ └── zlib1g │ ├── lintian │ │ └── overrides │ └── man │ └── man5 └── current -> 7
*1:Snappyの呼称はSnappy Ubuntu Coreのディストリビューション全体を指すように推移している様に見受けられたのですがいまいちわかりませんでした。