アプリケーションの配布。 パート1:Homebrew用の数式の作成



シリーズの紹介



最近、1つのコンソールユーティリティを配布する方法の問題に直面しましたか? pip



npm



gem



などの私の通常のツールは、ユーティリティ自体の言語bash



が原因で適合しませんでした。 その後、システムパッケージマネージャーを含め、アプリケーションを配布する必要があることが明らかになりました。 Macの場合、組み込み機能がないため、このようなパッケージマネージャーがいくつかあります。 そして、それぞれに独自の特徴と欠点があります。 そして、最初の部分では、 Homebrewについて詳しく説明し、そのためのパッケージを作成する方法を説明します。



さて、Linuxにアプリケーションをインストールするには、次の形式のパッケージを収集する必要があります: .tar.gz



.deb



および.rpm



。 第2部で説明します。



用語



まず、Homebrewの世界には特定の単語が十分にあるため、 条件に同意します。 記事では、あまりコミカルに見えないように、元の用語を使用します。 だから:



期間 説明
フォーミュラ パッケージ定義 /usr/local/Library/Formula/foo.rb
樽(樽) Formulaをインストールするためのプレフィックス /usr/local/Cellar/foo/0.1
optプレフィックス(プレフィックス) KegのアクティブバージョンへのSimlink / usr / local / opt / foo
セラー(Cellar) すべての樽がここにインストールされます。 / usr / local /セラー
タップ(クレーン) Formulaまたはプラグインを備えた追加のリポジトリ / usr / local /ライブラリ/タップ/ homebrew / homebrew-versions
びん 樽の組み立てバージョン qt-4.8.4.mavericks.bottle.tar.gz


Homebrewの仕組み



楽器のデバイス自体は無視することはできません;その作成者の一人はそれについて美しく語りました:



Homebrewは、GitとRubyの2つのことに基づいています。 Homebrewを初めてインストールすると、 /usr/local



公式リポジトリのコピーが作成されます。 brew update



コマンドでHomebrewを更新するたびに、 git pull



が発生し、どの式が変更されたかが表示されます。 brew install



コマンドを使用して何かをインストールすると、Homebrewはアーカイブをダウンロードし(将来、ファイルはキャッシュから取得されます)、そのハッシュをチェックしてからインストールを実行します。 しかし、実際には、Formulaははるかに複雑になる可能性があります。依存関係、ロード機能(svn、ftpなど)を持つことができます。 また、Homebrewは、可能であれば、既に組み立てられたパッケージを提供します(ボットによって自動的に作成されます)。


独自の数式を作成する



すでにgithubに特定のリリースがあるとします(そうでない場合は、 git tag



を使用して作成します )。 スクリプトの例に取り組みます。 数式を作成する最も簡単な方法は、 brew create https://github.com/sobolevn/git-secret/archive/v0.1.0.tar.gz



コマンドbrew create https://github.com/sobolevn/git-secret/archive/v0.1.0.tar.gz



を呼び出すことです:



それが変わります
 # Documentation: https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Formula-Cookbook.md # http://www.rubydoc.info/github/Homebrew/homebrew/master/Formula # PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST! class GitSecret < Formula desc "" homepage "" url "https://github.com/sobolevn/git-secret/archive/v0.1.0.tar.gz" version "0.1.0" sha256 "107c5555c203ad3b1498e2995fa8aa81942840189316d13933fcf0947180d10b" # depends_on "cmake" => :build depends_on :x11 # if your formula requires any X11/XQuartz components def install # ENV.deparallelize # if your formula fails when building in parallel # Remove unrecognized options if warned by configure system "./configure", "--disable-debug", "--disable-dependency-tracking", "--disable-silent-rules", "--prefix=#{prefix}" # system "cmake", ".", *std_cmake_args system "make", "install" # if this fails, try separate make/make install steps end test do # `test do` will create, run in and delete a temporary directory. # # This test will fail and we won't accept that! It's enough to just replace # "false" with the main program this formula installs, but it'd be nice if you # were more thorough. Run the test with `brew test git-secret`. Options passed # to `brew install` such as `--HEAD` also need to be provided to `brew test`. # # The installed folder is not in the path, so use the entire path to any # executables being tested: `system "#{bin}/program", "do", "something"`. system "false" end end
      
      







後でbrew edit



コマンドを使用して、式を編集できます。

抽象クラスFormula



*を継承するメインクラスに注意してください。 いくつかの重要な属性があります。





オプション



インストール中にさまざまなオプション、オプションパッケージを追加するかどうか、アセンブリ時に設定するパラメーターなどを追加することが必要になる場合があります。 この場合、Homebrewにはoption



*がありoption



。 これがgit.rb



*式のオプションの例だとしましょう:



オプションの例
  option "with-blk-sha1", "Compile with the block-optimized SHA1 implementation" option "without-completions", "Disable bash/zsh completions from 'contrib' directory" option "with-brewed-openssl", "Build with Homebrew OpenSSL instead of the system version" option "with-brewed-curl", "Use Homebrew's version of cURL library" option "with-brewed-svn", "Use Homebrew's version of SVN" option "with-persistent-https", "Build git-remote-persistent-https from 'contrib' directory"
      
      







build.with? "option_name"



コンストラクトbuild.with? "option_name"



コードから現在のオプションにアクセスするために使用されていますbuild.with? "option_name"



build.with? "option_name"



またはbuild.without? "option_name"



build.without? "option_name"







依存関係



アプリケーションには依存関係がある場合があります。それらには、 depends_on



*という特別なメソッドがdepends_on



ます 。 依存関係は、インストールのタイプとアクセサリの両方によって異なる可能性があることに注意することが重要です。システムパッケージに適合するのは式のみです。 いくつかのタイプの依存関係(インストール)があります。





依存関係の例
  depends_on "jpeg" depends_on "gtk+" => :optional depends_on "readline" => :recommended depends_on "boost" => "with-icu" depends_on :x11 => :optional
      
      







Homebrewの一部でない依存関係の場合、特別なresource



*ブロックがあり、これはurl



およびsha256



として宣言する必要があります。



「事前に荷物を梱包してください。」



Homebrewには、式を調べてボトルに集める素晴らしいボット*があります。 収集することを伝えるために、特別なbottle



*ブロックを使用します。ここでは、ダウンロードするURL、ファイルを保存するパス、およびMac OS Xのさまざまなバージョンのsha256



パラメーターを指定できます。



びん
 bottle do root_url "https://example.com" prefix "/opt/homebrew" cellar "/opt/homebrew/Cellar" revision 4 sha256 "4921af80137af9cc3d38fd17c9120da882448a090b0a8a3a19af3199b415bfca" => :yosemite sha256 "c71db15326ee9196cd98602e38d0b7fb2b818cdd48eede4ee8eb827d809e09ba" => :mavericks sha256 "85cc828a96735bdafcf29eb6291ca91bac846579bcef7308536e0c875d6c81d7" => :mountain_lion end
      
      







または、 bottle :unneeded



を指定することもできますbottle :unneeded



で、アセンブリは行われません。 ところで、正しいアセンブリを検証するために、優れたボットは、式に指定したテストを実行します。 それらについては以下。



リポジトリから最新バージョンをインストールします



head



*属性を使用すると、現在のブランチから直接最新バージョンをインストールできるように、リポジトリにリンクを追加できます( :branch



パラメーターを使用して決定できます)。 この方法で式を設定するには、 brew install --HEAD $formula



を使用brew install --HEAD $formula



必要があります。



数式のインストールプロセス



ここで、メインメソッドinstall



*について説明します。これは、インストールに必要なコマンドを実行します。 基本的には、 Kernel#system



*を使用したシステムコマンドの呼び出しを利用します。 ここで、設定のためにスクリプトに渡すことができる変数の特別な値について言及する必要があります 。それらは参照により利用可能です。



ユーザーとのコミュニケーション



メッセージを表示するには*特別な機能があります:





インストールに成功した後、またはbrew info $formula



コマンドを実行したときに、パッケージに関するあらゆる種類の詳細をユーザーに書き込むcaveats



*メソッドもあります。



設置テスト



ポイントは小さい:公式が確立されているかどうか、組み立てられているかどうかを確認します。 Homebrewで正しい動作を確認するために 、特別なtest



ブロックがあります。 サンドボックス内で実行され、実行された場合、式は正しくアセンブルされたと見なされます。 作成者自身が言うように、 test



ではバージョンのみをチェックしても構いません。 主なことは、プログラムが集まったことです。 しかし、テストがより確実に合格すればより良いでしょう。 これは機能をテストするのではなく、アセンブリのみをテストすることを理解することが重要です。 テストの例を次に示します。



試験例
  test do (testpath/".zshrc").write "source `brew --prefix`/share/antigen.zsh" system "/bin/zsh", "--login", "-i", "-c", "antigen help" end
      
      







テストをローカルで呼び出すには、 brew test $formula



コマンドを使用します。



フォーミュラは世界へ



それだけです、私たちの式はほとんど準備ができています! ここで、Homebrewの内部チェックに合格することを確認する必要がありますbrew audit --strict --online $formula



を実行します。 エラーがなければ、続行します。 その場合、編集します。 変更する必要があるものはすぐに教えてくれます。 これで、公式はオープンワールドに移行する準備ができました。 そして、オープンな世界から、式を設定するいくつかの方法があります:





それぞれについての詳細。



公式のHomebrewリポジトリに式を注ぎます



難しい方法。 私たちの式は、受け入れられるためにHomebrewの多くの要件を満たさなければなりません。 それらのいくつかを次に示します。





しかし、著者によると、 例外があります。



数式が適切な場合は、公式リポジトリにアップロードする必要があります。 プロジェクトに参加するための公式ガイドでは、Pull-Requestの作成方法を詳しく説明しています。微妙な点やルールがたくさんあります。



それが収まらない場合、または意図的にそこに送信したくない場合は、タップを作成する必要があります。



独自のタップを作成する



タップ*は、基本的に、独自の数式を保存する単なるリポジトリです。 Tapを作成するには、接頭辞homebrew-



を使用してgithubにリポジトリを作成します。 例: homebrew-mytap



数式自体は、ルートまたはFormula



フォルダー(またはHomebrewFormula



)にあります。 数式を設定するには、最初の2つの方法があります。





または1つのコマンド:





できた!



おわりに



Homebrewのいくつかの重要な機能を何度も一目見ようとしました。 もちろん、パッチ、コンパイラーの選択、独自のロード戦略の作成、 Python、Ruby(およびその他の)プログラムで作業する際の多くの微妙な点などのトピックは、「脇に置いておく」ことはできません。ボックス。」 しかし、希望する人は、公式ドキュメントの関連記事にいつでも慣れることができます。



Homebrewは非常に高品質のAPIを提供するため、数式の作成は非常に簡単です。 Rubyを知らなくても、すべてがすぐに判明するはずです。 これは私が得たものです。




All Articles