パッケージとか、ビルドとか、気づけばそういった単語に囲まれる日常になっていたので、ここでおさらいしたいと思います!
まずはLinuxのはなし
調べてくうちにとても遡りました。
gulpなどの利用にはコマンドラインを使う→参考図書に「Linux」とある→Linuxって何?
という流れです。
簡単にOSについてまとめます。
Linux
Linux:UNIX系OS。UNIX系OSでLinuxの他にはFreeBSD(BerkeleySoftwareDistribution)、macOS(MacのOS、かつてはOS X、Mac OS X)がある。
Linuxディストリビューション:カーネル部分(OSの中心部分)のみを指したときの「Linux」と、OSを動かすのに必要なソフトウェアをまとめて配布可能にしたもの。
主に
RedHat(レッドハット)系・・・Fedora(フェドラ)、CentOS(セントオーエス)
Debian(デビアン)系 ・・・Ubuntu(ウブンツ)
slackware(スラックウェア)系
など。
こちらがわかりやすかったです。
今更ながら Linux についてのメモ - Qiita
ディストリビューションに含まれる個々のソフトウェアはパッケージ化されており、パッケージ管理システムにより管理されています。
Wikipedia
Linuxディストリビューション - Wikipedia
Linuxを一般利用者がインストールしたり、利用できる形にまとめ上げたもの(頒布形態)。
「ディストリビューション」という言葉は、Linuxで使われる用語ととらえて良さそうです。
macOSはLinuxに似ている
macOSにもカーネル(Darwin/ダーウィン)があり、FinderやSafari、iTunesなどもろもろのソフトウェアが入っています。
同じUNIX系ということで、兄弟みたいなものでしょうか。
Webに情報が多い、macOSにも似ているLinuxを知る、というのは大事みたいです。
パッケージ管理システム
ここまで見てきたLinuxからパッケージ管理システムについて調べました。
Linuxディストリビューションとは、OSが使いやすいようにソフトウェアもくっつけたものなので、カーネルだけインストールして、自力でソフトウェアをインストール、ということもできますが、超大変らしいです。
なので、いろいろなパッケージがセットになった、便利なLinuxディストリビューションを利用するのが一般的です。そしてディストリビューションの中に含まれている、パッケージ管理システムを使います。
パッケージ管理システムを使えば、パッケージ同士の依存関係や競合の問題を解決してくれます。
Linuxディストリビューションの種類によってパッケージ管理システムは異なります。
Linuxのパッケージ管理システムについてはこちら。
【パッケージ管理システムとは?】Linuxでのパッケージ管理の使い方まとめました
macOSのパッケージ管理システム
macOSにもパッケージ管理システムが用意されていて、Homebrew(ホームブルー)かMacPortsが多く使われています。
Homebrewについて 。インストール方法から使い方まで詳しいです。
パッケージ管理システム Homebrew - Qiita
言語はRuby(ルビー)で書かれています。
パッケージとソフトウェア
weblio辞書では
パッケージ管理システム上ではパッケージ単位でソフトウェアを導入する。
とあります。
パッケージ管理システムとは何? Weblio辞書
パッケージソフトウェアは「市販に売られているソフトウェア」という意味らしいので、パッケージとは、下記の通り、もろもろのファイルがまとまったもの
「パッケージになっているソフトウェア」 という言い方はあっているのかな、 と思いました。
パッケージの中身
- インストールされるファイル(実行ファイル、データファイル)←ライブラリ
- インストール時に動作させるスクリプト
- インストールするために他のソフトウェアが必要、などの依存情報
ところでなぜ今、Homebrewを使ってコマンドラインからソフトウェアをインストールしようとしているのか。
それはきっとブラウザやAppStoreからインストールできないソフトを利用したい、プログラミングの開発環境をPCに作る時に必要なソフトのインストール方法なのだろう、というところまでは考えられました。
パッケージ形式
パッケージには実行形式ではないものと実行形式のものに分かれます。
パッケージ形式 | パッケージが使われる主なOS | インストール |
---|---|---|
実行形式でないもの | Linuxディストリビューション | パッケージ管理システムを使う |
実行形式 | macOS、Windows | パッケージが独自に行う |
後者はパッケージにインストール用ソフトウェアがくっついて「インストーラー」という代物になるのでしょう。
あらかじめビルドしてある成果物はバイナリで配布されているため、インストールが早いです。
OSがmacOSでも、前者のように実行形式でないパッケージをインストールする場合は、パッケージ管理システム(ここではHomebrew)を使うということなのでしょう。
ソースコードを取得して自分のPCでビルドすることになるので、自分のMacに最適化することができます。
ここで、実行形式ではないパッケージのインストールの仕組みについて調べます。
実行形式ではないパッケージのインストールについて
ダウンロードからインストールまで、どのようなことが裏で行われているのか調べました。 パッケージマネージャがパッケージをインストールする仕組み – ymyzk’s blog
パッケージマネージャはパッケージからライブラリのソースコードを取り出し、決められたディレクトリにファイルをコピーすることで、パッケージをインストールしています(これは最も単純な場合なので,ファイルをコピーする前にコンパイルするような場合もあります)
ライブラリ・・・様々な他のプログラムから利用できるように、プログラムをまとめたもの。ライブラリ自体のソースコードに加えて、メタデータ (パッケージの名前やバージョンの情報)、ドキュメントなどがまとめられたものがパッケージ。
インストールとは、そのソフトウェアを実行できる状態にすることなので、
パッケージをダウンロード → ライブラリをPCの所定のディレクトリに置く = インストール
→ プログラム中からライブラリを利用する(コマンドが利用できる) = ソフトウェアの実行
という流れなのかなと。
なお、Homebrewをインストールして使えるコマンド、brew
を使って、Homebrewが扱っている公式パッケージをWeb上から探し出してインストールすることができます。
インストールする際にはパッケージはバイナリになっている
その前に気になっていた単語について。
ソースコード・・・人が書いた、プログラムの元ネタ
バイナリ(データ、コード)・・・ソースコードをコンピュータが分かる形に変換したもの(実行できるプログラムのこと)。2進数で表現される
コンパイル・・・ソースコードをバイナリコードに変換する作業
ビルド・・・ ソースコードから実際のプログラム(実行可能ファイル、配布パッケージ)を作ること。コンパイルもビルドの過程の一部
こちらがわかりやすいです!
https://wa3.i-3-i.info/word16355.html
https://wa3.i-3-i.info/word12775.html
コンピューターはバイナリでないと理解できないので、インストールする前にビルドが必要です。 ここで再びパッケージ管理システムについて話を戻します。
パッケージ管理システムには2つのパターンがあります。
- バイナリを取得するもの
- ソースコードを取得してビルドするもの
「Homebrew」の訳は「自家醸造:ユーザ自らがビルドする」。
homebrew
とは「ユーザが自らパッケージをビルドして使用する」ことのメタファーで「ビールを自家醸造して保存する・飲む」ことを意味しているのです。 手順(調理法formula)通りにパッケージをビルド(醸造)して保存(/usr/local/cellerに格納)して、使う(/usr/loca/binにリンク)ってことのようです。
いろいろなパッケージ管理システム
パッケージ管理ツールといえば、他にもあります。最後にまとめました。
パッケージ管理ツール | システム | 特徴 |
---|---|---|
homebrew | macOS | インストールは一般ユーザで可能 |
npm (Node Package Manager) | node.js | V8 JavaScriptエンジンで動作する |
Composer | PHP | Laravelを含めた有名なオープンソースのPHPプロジェクトの重要な機能の一部として利用されている |
RubyGems | Ruby | Rubyのプログラムと("gem" と呼ばれる)ライブラリの配布用標準フォーマットを提供している |
pip | Python | パッケージ管理ツールeasy_installの強化版 |
APT | Debian系OS | apt-getやapt-cache等の複数のコマンドから成る |
Yum | RedHat系OS | rpm形式パッケージを対象とする |
RPM | RedHat系OS | rpm形式パッケージを生成する機能もある |
結局、パッケージ管理ツール/システム、ソフトウェア、パッケージ、ライブラリといった単語に翻弄されて定義が未だに曖昧ですが、8割くらいは自分の中で消化できたと思います。満足。
anyenv
やnodenv
、npm
、gulp
についておさらいしたかったのですが、前段階の知識が怪しかったので。少し時間をあけてまとめます!
世に出ている素晴らしい記事のおかげでなんとか理解できました。引用しまくりです。ありがとうございます!
続きを書きました。こちら。