rcmdnk's blog

Deliciously Chocolatey: 100 Cocoa-rich Recipes for Bakes, Cakes and Chocolate Treats

新しいWindowsマシンを手に入れて からアプリとかを取り敢えず直接手で入れてましたが 落ち着いた所でMacのHomebrewやLinux apt-get/yum的な パッケージ管理を試してみました。

Windows 10からはデフォルトでPackageManagementという パッケージ管理用のコマンドツールが PowerShellで使える様になっています。

そのツールからパッケージソースとしてChocolateyを使い、 登録されているアプリをインストールすることが出来ます。

Sponsored Links

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

最初にすること

なにげに超重要事項ですが、 PackageManagementコマンドを使う前に 管理者権限でPowerShellを立ち上げて

PS > Set-ExecutionPolicy RemoteSigned

を実行します。

ExecutionPlicyはPowerShellのスクリプト実行に関するポリシーで、 デフォルトではRestrictedになっていて、 一切のスクリプトの実行が禁止されています。

なので普通にPowerShellからスクリプトを実行することも出来ません。

設定できる値は

  • Restricted: 全てのスクリプトの実行禁止。
  • AllSigned: 署名付きのスクリプトのみ実行可能。
  • RemoteSigned: 署名付きのスクリプト、及びローカルに保存されているスクリプトが実行可能。
  • Unrestricted: 全てのスクリプトが実行可能。ただし署名なしのネット上のスクリプトは実行するかどうか許可を求められる。
  • Bypass: 全てのスクリプトをそのまま実行。

ということで、PackageManagementなんかはインストール用の スクリプトをダウンロードして使うのでRemoteSigned以下の設定にする必要があります。

ローカルと言ってもネットからダウンロードしたものはZoneIDという情報により 識別されるとのこと。

Tech TIPS:WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する - @IT

いずれにしろ、この設定をしないままPackageManagementを使ってインストールしようとすると インストールできたように見えて出来てない、みたいな事が起こるので注意。 (最初それがわからないまま全然インストール出来ないので暫く無視していた訳で。。。)

PackageManagementを使ってみる

ExecutionPlicyの設定が終わったら、 通常ユーザーでPowerShellを立ち上げ直してPackageManagementコマンドを使ってみます。

Package Management Cmdlets

上のページに使えるコマンドが載っていますが、 基本、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です。

Chocolatey Gallery Packages

他のコマンドでもソウですが、ここの-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でなんとか書いてみたいな、とも思ってます。

Sponsored Links
Sponsored Links