Chocolateyの自作パッケージ入門(1)

Chocolateyとは?

ChocolateyはWindowsのパッケージマネージャです。コマンドラインからWindowsにソフトウェアをインストールできます。MacのHomebrew、Linuxのaptやyumといえば技術者向けにはわかりやすいかもしれません。Windowsにパッケージマネージャはないと思い込んでいる人もいるようなのですが、Chocolateyはかなりまともに動きます。プログラミング用の環境とかもコマンド一発で整えられて超便利。

しかし、どうにもHomebrewやapt,yumなどと比べてパッケージが少ないです。やはり知名度と歴史の違いが大きいのでしょう。(機能面でもまだまだではありますが・・・)

ないのなら、作ってしまえ、パッケージ ということで、この記事ではChocolateyのパッケージを自作してみようの入門編です。

一応PowerShellの知識が必要ですが、そんなに難しいことをするわけではないので大丈夫だと思います。各ステップで適宜Githbuの作業履歴を張っておくので参考にしてください。

Chocolateyパッケージ初歩

Chocolateyでは.NET Frameworkのパッケージマネージャ、Nugetのシステムを利用します。(C#やってる方にはおなじみですね。)

さて、Chocolateyパッケージはソフトウェアのバイナリの取得方法によって自己完結型パッケージとダウロード型パッケージの二種類に別れます。

自己完結型パッケージ

自己完結型パッケージ(self-contained package)とは、Chocolateyのパッケージの中にそのソフト自体を含んでしまう形のパッケージです。
他のURLからファイルをダウンロードすることなくインストールが行なえます。お手軽な一方でChocolatey.orgに公開するにはいくつかの問題を含んでいます。

ただし、企業がChocolatey.orgを利用せず社内のパソコンにソフトウェアを配布する場合などは再配布に当たらないのでこの制限は気にする必要がなくなります。

ダウンロード型パッケージ

パッケージにはダウンロードとインストールの手順(PowerShellスクリプト)のみを記しておき、実際のファイルはソフトウェアの公式配布場所などからダウンロードしてくるパターンです。
こちらはあくまで手動でインストールするのと同じであり、再配布の許可はいらない、という主張になっています。

どちらにするか?

基本的にダウンロード型にしておくのが一般的なようです。自己完結型は検証用に英語でダウンロードの仕方などを書かないといけませんし、Chocolateyのサーバーを圧迫します。

といった場合は自己完結パッケージを検討しても良いかもしれません。ただし、再配布が許されていることを必ず明示的に確認しておきましょう。

事前準備

とりあえず、必要なものを用意します。
当然Chocolateyが必要なのでインストールします。

Chocolatey Installation

最新のPowerShellと、チェックサムの計算ツールが必要なのでchecksumパッケージを入れます。ついでに全パッケージを更新しておきます。

> cinst -y powershell #最新のPowershell
> cinst -y checksum # checksumパッケージ導入
> cup all # すべてのパッケージを更新

対象の確認

Chocolatey.orgやGoogleで検索してインストールしたいソフトのパッケージがないことを確認したら、そのソフトの情報を確認します。 今回は、Janus Home Page様のバイナリエディタxeditを具体例に紹介します。

まず、そのソフトをダウンロードできる場所を探します。http://www002.upp.so-net.ne.jp/janus/ にZIPへのリンクがあることが確認できます。ここで実際にZIPファイルをダウンロードしておきます。

(なお、zipではなくてインストーラとかでも大丈夫ですがそのやり方は入門編(2)で紹介する予定としておきます。)

パッケージの作成

パッケージテンプレートの作成

自作Chocolateyパッケージ達を入れるディレクトリを作り、PowerShellでそこに移動します。そして、以下を実行するとディレクトリとファイルを自動生成してくれます。

choco new パッケージID

ここでのパッケージIDは、インストール時にcinstの後ろに入力する名前になります。実際に公開する際には細かいルールがあったりしますが、今回は一旦おいておきます。全部小文字で、空白は含まずハイフンにする、ぐらいは確認しておくと良いです。 CreatePackages · chocolatey/choco Wiki

今回は以下のように入力した場合で話を進めます。

choco new xedit

できたファイルの確認

コマンドを実行すると、以下のファイルが作成されます。ざっくり説明。

今回はダウンロード型パッケージのため、xeidt.nuspec,chocolateyinstall.ps1以外はすべて不要ですので削除します。 まぁ、ReadMe.mdぐらいは残しておいても大丈夫です。

ここまでのディレクトリの状態

chocolateyinstall.ps1の記述

上記の通り、ソフトのインストール処理を行うのがchocolateyinstall.ps1です。といってもオプションを指定して関数を呼び出すだけです。大部分が自動で作られていますので、自分で記述を修正します。コメントやWikiの説明を見ると大体わかります。また、他のパッケージをサンプルとして真似するほうが楽です。

  1. ファイルのダウンロードURL

    ファイルをダウンロードするURLです。今回はzipファイルですね。
    なお、別途64bit版が用意されているようならそのURLを$url64に入れます。ない場合は$url64は削除(orコメントアウト)します。

     $url        = 'http://www002.upp.so-net.ne.jp/janus/program/xedit184.zip'
     #64bit版はない
     #$url64 = '' 
    
  2. packageArgs

    fileTypeに#only one of these: exe, msi, msuと書いてあります。今回はzipなので行ごと削除。さらに、silentArgsとvalidExitCodesもダウンロード型では不要なので削除。(インストーラ型の場合は適切なのを指定します。)。

    今回は64bit版がないため、url64、checksum64,checksumType64も削除します。

  3. Checksumの計算

    Chocolateyではパッケージの改ざんと破損をチェックするためにチェックサムを確認します。準備のステップで入れたchecksum.exeでSHA256が計算できます。xeidt.zipも準備段階でダウンロードしてきたファイルです。

     $ checksum -t sha256 xedit.zip
     4EA6A83F1B75005413E7E8C283969601FC663B9708C35F0765A09ED441F9720E
    

    その結果をchocolateyinstall.ps1のchecksum = ‘‘のところに入れます。

     checksum = `4EA6A83F1B75005413E7E8C283969601FC663B9708C35F0765A09ED441F9720E`
    
  4. インストールコマンド Install-ChocolateyZipPackage @packageArgsはインストーラexe用なので削除。

    今回はZipファイルのインストールなので、Install-ChocolateyZipPackage @packageArgsのコメントアウトを外します。

  5. コメントの削除 このファイルには大量の不要なコメントが含まれているので削除します。削除されていない場合はChocolatey.orgでリジェクトされるので必須の作業です。ファイルの先頭にコメントを削除する方法が載っています。

     # IMPORTANT: Before releasing this package, copy/paste the next 2 lines into PowerShell to remove all comments from this file:
     #   $f='c:\path\to\thisFile.ps1'
     #   gc $f | ? {$_ -notmatch "^\s*#"} | % {$_ -replace '(^.*?)\s*?[^``]#.*','$1'} | Out-File $f+".~" -en utf8; mv -fo $f+".~" $f
    

    powershellを開き以下のコマンドを叩けばよいということです。

     > $f = ファイル名
     > gc $f | ? {$_ -notmatch "^\s*#"} | % {$_ -replace '(^.*?)\s*?[^``]#.*','$1'} | Out-File $f+".~" -en utf8; mv -fo $f+".~" $f
    

日本語の説明だけだとわかりにくいと思うので実際のファイルを確認してみてください。この記事の最後に実際のパッケージのレポジトリがあるのでそれも参考にしてください。 chocolatey-packages/chocolateyinstall.ps1 at 5c7a64bb8aa456be8a038d9f17d93141043cb6d5 · KageShiron/chocolatey-packages

nuspecファイルの記述

nuspecはNugetパッケージの情報が書かれているXMLファイルです。ただし、ChocolateyはNugetの仕様を独自に拡張しているため注意が必要です。NugetExplorerだとみられないようです。

基本的にはファイル内にコメントが書いてあるためそれに従って記述します。とりあえず、id、version、files程度が適切な位置に書いてあれば最低限動くと思います。(Chocolatey.orgに公開するにはちゃんと項目を埋める必要があります。)

わからないところがあれば具体例を見るとよいかもしれません。

Nugetのドキュメントもご覧ください。

.nuspec File Reference for NuGet | Microsoft Docs

さて、完成したnuspecのファイルがこちらです。一通り項目を埋めてあります。

chocolatey-packages/xedit.nuspec at 5c7a64bb8aa456be8a038d9f17d93141043cb6d5 · KageShiron/chocolatey-packages

めんどくさい

ちなみに、あまりにも面倒なためGUIから編集できる自作ソフトの作成をちょろちょろ進めていたりもします。とりあえずnuspecの書き出しぐらいはできていたりしますが、まだリリースには至っていません。一応ソースは公開してますが、あんまりきれいじゃないです・・・

KageShiron/PetitChoco: Chocolatey Package Creation Supporter

パッケージング

上記の作業がすべて終了したら、関連ファイルをまとめてパッケージにします。PowerShellでnuspecのあるディレクトリに向かい、cpackと叩くだけで.nupkgのファイルの完成です!

テスト

実際に完成したパッケージを実行してみます。

choco install package-name -s .

適切にインストールされたでしょうか?

今後やるべきこと

以上が初歩的なパッケージの作り方です。わかりにくかったらご指摘ください・・・

さて、公式に公開し、今後も安定運用していくにはまだステップがあります。今後詳しい記事を書いていきたいとは思っています。

  1. 公式のルールをよく確認する

    idが不適切であったり、作者名がなかったりするとChocolatey.orgにアップロードしてもリジェクトされます。Wikiページをよく確認して大丈夫なように調整しましょう。私も何度もリジェクトされてますが、修正すればいいだけの話なので気負いせずにやりましょう。

    CreatePackages · chocolatey/choco Wiki

  2. Chocolatey.orgのアカウントを作成し、実際に公開する

    Chocolatey.orgで自分のアカウントを作成し、作成したパッケージを公開します。ブラウザからアップロードもできますし、コマンドラインからも可能です。

  3. 自動アップデートの仕組みを構築する

    現在だとアップデートが出たら自力で更新して公開を行う必要があります。自分が作者のソフトだとか、パッケージ数が少ないならいいのですが今後管理パッケージが増えると自分で確認して更新してアップして・・・というのはかならず続かなくなります。

    そこで、自動アップデートの仕組みを構築します。最終的にはApp VoyerなどのCIが毎日勝手に更新チェックをしてパッケージを作成し、pushまでしてくれるようになります。

    majkinetor/au: Chocolatey Automatic Package Updater Module

  4. 仮想環境でのテスト Vegrant用のコンテナが提供されているので、それでテストを行うと、どの環境でも動くことが確認できます。

と、適当にいろいろ書いてますが、最終的には先ほど述べた自作ツールで可能な限り手抜きをできるようにしたいなぁと思っています。いつになることやら・・・

参考

大体公式のWikiにすべて乗っています。

パッケージのサンプルにはこちらをどうぞ