パッケージ管理システムとソフトウェアのインストール

パッケージとか、ビルドとか、気づけばそういった単語に囲まれる日常になっていたので、ここでおさらいしたいと思います!

まずはLinuxのはなし

調べてくうちにとても遡りました。
gulpなどの利用にはコマンドラインを使う→参考図書に「Linux」とある→Linuxって何? という流れです。 簡単にOSについてまとめます。

Linux

LinuxUNIX系OSUNIX系OSLinuxの他にはFreeBSD(BerkeleySoftwareDistribution)、macOSMacのOS、かつてはOS XMac OS X)がある。

Linuxディストリビューションカーネル部分(OSの中心部分)のみを指したときの「Linux」と、OSを動かすのに必要なソフトウェアをまとめて配布可能にしたもの。
主に
RedHat(レッドハット)系・・・Fedora(フェドラ)、CentOSセントオーエス
Debianデビアン)系 ・・・Ubuntuウブンツ
slackware(スラックウェア)系
など。

こちらがわかりやすかったです。
今更ながら Linux についてのメモ - Qiita

ディストリビューションに含まれる個々のソフトウェアはパッケージ化されており、パッケージ管理システムにより管理されています。

Wikipedia
Linuxディストリビューション - Wikipedia

Linuxを一般利用者がインストールしたり、利用できる形にまとめ上げたもの(頒布形態)。

ディストリビューション」という言葉は、Linuxで使われる用語ととらえて良さそうです。

macOSLinuxに似ている

macOSにもカーネルDarwinダーウィン)があり、FinderやSafariiTunesなどもろもろのソフトウェアが入っています。
同じ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ディストリビューション パッケージ管理システムを使う
実行形式 macOSWindows パッケージが独自に行う

後者はパッケージにインストール用ソフトウェアがくっついて「インストーラ」という代物になるのでしょう。
あらかじめビルドしてある成果物はバイナリで配布されているため、インストールが早いです。

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割くらいは自分の中で消化できたと思います。満足。

anyenvnodenvnpmgulpについておさらいしたかったのですが、前段階の知識が怪しかったので。少し時間をあけてまとめます!

世に出ている素晴らしい記事のおかげでなんとか理解できました。引用しまくりです。ありがとうございます!


続きを書きました。こちら