新しいWindowsマシンを手に入れて からアプリとかを取り敢えず直接手で入れてましたが 落ち着いた所でMacのHomebrewやLinux apt-get/yum的な パッケージ管理を試してみました。
Windows 10からはデフォルトでPackageManagementという パッケージ管理用のコマンドツールが PowerShellで使える様になっています。
そのツールからパッケージソースとしてChocolateyを使い、 登録されているアプリをインストールすることが出来ます。
PackageManagement (OneGet)
PackageManagement は元々 OneGet と呼ばれていたもので、 Windows 10からはPowerShellコマンドとしてデフォルトでインストールされています。
以前、Chocolateyというツールをインストールして使っていましたが、 PackageManagementではこのChocolateyもパッケージソースとして取り込むことで Chocolateyに登録されているアプリもPackageManagementのコマンドで 管理できる様になります。
デフォルトで入ってるツールという事でこれで管理してみることに。
Windows 10より前のバージョンでは 以下よりWindows Management Framework 5.0をインストールすれば使える様になります。
Download Windows Management Framework 5.0 Preview April 2015 from Official Microsoft Download Center: https://www.microsoft.com/en-us/download/details.aspx?id=46889
最初にすること
なにげに超重要事項ですが、 PackageManagementコマンドを使う前に 管理者権限でPowerShellを立ち上げて
PS > Set-ExecutionPolicy RemoteSigned
を実行します。
ExecutionPlicy
はPowerShellのスクリプト実行に関するポリシーで、
デフォルトではRestricted
になっていて、
一切のスクリプトの実行が禁止されています。
なので普通にPowerShellからスクリプトを実行することも出来ません。
設定できる値は
Restricted
: 全てのスクリプトの実行禁止。AllSigned
: 署名付きのスクリプトのみ実行可能。RemoteSigned
: 署名付きのスクリプト、及びローカルに保存されているスクリプトが実行可能。Unrestricted
: 全てのスクリプトが実行可能。ただし署名なしのネット上のスクリプトは実行するかどうか許可を求められる。Bypass
: 全てのスクリプトをそのまま実行。
ということで、PackageManagementなんかはインストール用の
スクリプトをダウンロードして使うのでRemoteSigned
以下の設定にする必要があります。
ローカル
と言ってもネットからダウンロードしたものはZoneIDという情報により
識別されるとのこと。
いずれにしろ、この設定をしないままPackageManagementを使ってインストールしようとすると インストールできたように見えて出来てない、みたいな事が起こるので注意。 (最初それがわからないまま全然インストール出来ないので暫く無視していた訳で。。。)
PackageManagementを使ってみる
ExecutionPlicyの設定が終わったら、 通常ユーザーでPowerShellを立ち上げ直してPackageManagementコマンドを使ってみます。
上のページに使えるコマンドが載っていますが、
基本、Find-
が取り扱える物の検索、Get-
が既にインストールされてる物の検索、
Install-
がインストール、Uninstall-
がアンインストール、になります。
Provider/Souerce
PackageManagementではProviderを経由してパッケージをインストールします。 ProviderはPSModuleやNuGet、Chocolateyなどパッケージを供給するシステムです。
さらにそれらのProviderが使うSourceの設定もあります。 ChocolateyならSourceもChocolateyです。
PS > Find-PackageProvider
Name Version Source Summary
---- ------- ------ -------
nuget 2.8.5.202 https://az818661.vo.msecnd.... NuGet provider for the OneGet meta-pa...
chocolatey 2.8.5.130 https://az818661.vo.msecnd.... ChocolateyPrototype provider for the ...
ContainerProvider 0.5.2 PSGallery ContainerProvider is a Windows PowerS...
GistProvider 0.6 PSGallery Gist-as-a-Package - PackageManagement...
TSDProvider 0.2 PSGallery PowerShell PackageManager provider to...
GitHubProvider 0.5 PSGallery GitHub-as-a-Package - PackageManageme...
MyAlbum 0.1.2 PSGallery MyAlbum provider discovers the photos...
OfficeProvider 1.0.0.1 PSGallery OfficeProvider allows users to instal...
で使えるプロバイダー一覧が出てきますが、実際にインストールされているものは
PS > Get-PackageProvider
Name Version DynamicOptions
---- ------- --------------
msi 3.0.0.0 AdditionalArguments
msu 3.0.0.0
NuGet 2.8.5.201 Destination, ExcludeVersion, Headers, FilterOnTag, Contains, AllowPrerelea.
PowerShellGet 1.0.0.1 PackageManagementProvider, Type, Scope, InstallUpdate, PackageManagementPr.
Programs 3.0.0.0 IncludeWindowsInstaller, IncludeSystemComponent
で出てきます。最初はNuGetやChocolateyは入っていません。
登録はInstall-PackageProvider Chocolatey
でも良いのですが、
PS > Get-PackageProvider Chocolatey -ForceBootstrap
としてもインストールされて無ければ自動的インストールされます。
このコマンドのヘルプを見る限りそうでは無さそうなんですが、 このオプションを付けなくても何故かGetで確認するだけでもインストール出来てるみたいです。
PS > Get-PackageProvider
Name Version DynamicOptions
---- ------- --------------
Chocolatey 2.8.5.130 SkipDependencies, ContinueOnFailure, ExcludeVersion, ForceX86, PackageSave.
msi 3.0.0.0 AdditionalArguments
msu 3.0.0.0
NuGet 2.8.5.201 Destination, ExcludeVersion, Headers, FilterOnTag, Contains, AllowPrerelea.
PowerShellGet 1.0.0.1 PackageManagementProvider, Type, Scope, InstallUpdate, PackageManagementPr.
Programs 3.0.0.0 IncludeWindowsInstaller, IncludeSystemComponent
でChocolateyが入っていればOK。ついでのソースもチェックすると
PS > Get-PackageSource
Name ProviderName IsTrusted IsRegistered IsValidated Location
---- ------------ --------- ------------ ----------- --------
chocolatey Chocolatey True True True http://chocolatey.org/api/v2
PSGallery PowerShellGet False True False https://www.powershellgallery.
こちらにもchocolatey
が入っているはずです。
(最初はPSGallery
だけがSourceにはあります。)
これでChocolateyに登録されているアプリをインストールする準備が整いました。
アプリのインストール
まず、Chocolateyのパッケージに登録されている名前を探すためにFind
で
PS > Find-Package -Name Firefox
Name Version Source Summary
---- ------- ------ -------
Firefox 45.0 chocolatey Bringing together all kinds of awesomeness to...
な感じで探すとインストールできるパッケージ一覧が出てきます。
ここではFirefox
という名前で検索したらFirefox
というパッケージが
chocolatey
ソースに見つかりました。
もちろん、Chocolateyのページからパッケージを探してきてもOKです。
他のコマンドでもソウですが、ここの-Name
と云うオプションは無くても大丈夫です。
-
オプションになってない最初の引数を検索ワードとして使います。
2つ目以降の引数はコマンドオプションになるので
複数を一気に検索することは出来ない?みたいです。
また、Find-
に引数を与えなければ全ての扱えるパッケージが表示されます。
Chocolateyのパッケージだけ表示したい場合は
PS > Find-Package -ProviderName chocolatey
とします。(-Nameとの組み合わせもOK、というかしないと沢山有りすぎる。)
取り敢えずFirefoxが見つかったのでインストールするには
PS > Install-Package Firefox
でOK。
この時、
パッケージは、信頼済みとマークされていないパッケージ ソースから取得されています。
'chocolatey' からソフトウェアをアンインストールしますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): y
と言った感じの表示が出たら上のExecutionPlicy
の設定がきちんと出来ていない状態の可能性があります。
文章を見るとインストールしようとしてるのにアンインストール
と言われていて、
これをY
で答えると一見何故かインストールされたかの様になります。
(Get
のリストに出る。)
が、実際にはChocolateyのFirefox用のインストールスクリプトを取ってこれただけで
アプリ自体のインストールは行われていません。
(ここでしっかりとしたエラーみたいのが出ないのでちょっと戸惑う。。。
どこかわからない所にインストールされて見つけられないだけじゃないか、的な。。。)
この手のアプリのインストールは通常のインストールファイルを実行してるだけなので、 成功すればC:\Program Files\Mozilla Firefox等に入って スタートメニューにも登録されているはずです。
PS > Get-Package Firefox
Name Version Source Summary
---- ------- ------ -------
Firefox 45.0 C:\Chocolatey\lib\Firefox.4... Bringing together all kinds of awesomeness to make browsing better for you
みたいにChocolatey
の物が入っていればOK。
また、既にFirefoxがインストールされている場合、
インストールに失敗しますがGet
のリストに登録はされます。
(多分Install-Package
コマンド実行時点でスクリプトを取ってきて
C:\Chocolatey\libにスクリプトを置くのでそれを見てGet
はリストを作ってる感じ。)
PS > Get-Package Firefox
Name Version Source Summary
---- ------- ------ -------
Firefox 45.0 C:\Chocolatey\lib\Firefox.4... Bringing together all kinds of awesom.
Mozilla Firefox 45.0 (x64 ja) 45.0 Mozilla Firefox 45.0 (x64 ja)
ちなみにProviderNameを指定しないと普通にインストールされたものも検索され、 表示されます。
アプリのアンインストール
アンインストールは
PS > Uninstall-Package Firefox
この場合もChocolateyのパッケージいとかだと通常のアプリのアンインストールプログラムを呼び出すだけなので、
仮にもともとFirefoxが入っていてInstall-Package
をして失敗しても(Firefoxはすでに入っているため)、
Uninstall-Package
は出来てもともと入っていたアプリがアンインストールされます。
なので現在すでにインストールされているアプリを
PackageManagementで管理したい、という場合には
一度アンインストールしたりしなくても良くて、
コマンド自体は失敗しても良いからInstall-Package
で再追加しておけば良いのだと思います。
追記: 2016/05/14
どうも一部のアプリではアンインストールの設定がきちんと書かれてないのか、
Uninstall-Package
をしてもリストから削除されるだけで
Windows自体からは削除されないことがあるみたいです。
コマンドを打って一瞬で終了するような場合は大概きちんとアンインストール出来ていません。
その場合は設定アプリと機能へ行って手動でアンインストールしてください。
追記ここまで
PowerShell tips
PackageManagementとは直接関係ないけどいくつかPowerShellに関して。
- コマンドの大文字小文字は関係ない
Windowsは基本的に大文字小文字を区別しないシステムなので PowerShell上でも大文字小文字は基本的に関係ありません。
上のコマンドもわかりやすくInstall-Package Firefox
とかやってますが
PS > install-package firefox
でも全く同じです。
- コマンドのヘルプ
コマンドのヘルプを見るUnixのman
に当たるコマンドはGet-Help
です。
PS > Get-Help Install-Package
等とします。 さらに詳しい情報などが欲しい場合には
PS > Get-Help Install-Package -Detailed
と-Detailed
オプションを。-Examples
で例を、
-Full
とするとそれらを含めた全てのヘルプを表示してくれます。
まとめ
差し当たりインストールは出来る様になりましたが、 今のところただインストール、アンインストールがコマンドラインから出来る、 というだけの状態。
Chocolateyにはxml形式でアプリをリストしてあるファイルを使うと 全てのアプリを一気にインストールできる、という機能がありましたが、 PackageManagementにはまとめてどうこうする、という機能は今のところ見当たりません。
コマンドラインからインストールできることのメリットは インストールやその管理を自動化する事に大きくあるので Brew-file の様な自動でリストファイルを作って管理出来る様なものが欲しいところ。
前にChocolateyでやってたようにCygiwnからPowerShellスクリプトを呼んで どうこうするようにすれば簡単なものはすぐ作れそうなものですが、 せっかくPackageManagementが純正で入ってる様な状態なので PowerShellでなんとか書いてみたいな、とも思ってます。