ブリーフ:この詳細なガイドは、ソースコードからプログラムをインストールする方法を説明しますLinuxでのコードとソースコードからインストールされたソフトウェアを削除する方法。
Linuxディストリビューションの最大の強みの一つは、そのパッケージマネージャと関連するソフトウェアリポジトリです。 それらを使用すると、完全に自動化された方法でコンピュータに新しいソフトウェアをダウンロードしてインストールするために必要なすべ
しかし、彼らのすべての努力にもかかわらず、パッケージメンテナはすべてのユースケースを処理することはできません。 また、彼らはそこに利用可能なすべてのソフトウェアをパッケージ化することはできません。 だから、あなたが自分で新しいソフトウェアをコンパイルしてインストールする必要があります状況がまだあります。 私にとっては、最も一般的な理由は、はるかに、私は非常に特定のバージョンを実行するか、いくつかの派手なコンパイルオプションを使用してソーあなたのニーズが後者のカテゴリに属している場合、あなたはすでに何をすべきかを知っている可能性があります。
しかし、大多数のLinuxユーザーにとって、ソースコードから初めてソフトウェアをコンパイルしてインストールすることは、開始式のように見えるかもしれません。A.Linuxでソースコードからソフトウェアをインストールする
そして、それはまさにここでやることです。 この記事の目的のために、私のシステムにNodeJS8.1.1をインストールする必要があるとしましょう。 そのバージョンは正確に。 Debianリポジトリから入手できないバージョン:
sh$ apt-cache madison nodejs | grep amd64 nodejs | 6.11.1~dfsg-1 | http://deb.debian.org/debian experimental/main amd64 Packages nodejs | 4.8.2~dfsg-1 | http://ftp.fr.debian.org/debian stretch/main amd64 Packages nodejs | 4.8.2~dfsg-1~bpo8+1 | http://ftp.fr.debian.org/debian jessie-backports/main amd64 Packages nodejs | 0.10.29~dfsg-2 | http://ftp.fr.debian.org/debian jessie/main amd64 Packages nodejs | 0.10.29~dfsg-1~bpo70+1 | http://ftp.fr.debian.org/debian wheezy-backports/main amd64 Packages
今、UbuntuまたはDebianにNodeJsをインストールするのは、パッケージマネージャーで行う しかし、ソースコードを介してそれをやってみましょう。
- ステップ1:GitHubからソースコードを取得する
- ステップ2:プログラムのビルドシステムを理解する
- ステップ3 ステップ3: Fhs
- B.ソースコードからのインストール中に問題が発生した場合は?上で説明したのは、よく文書化されたプロジェクトの”ビルド命令”ページで見ることができるものです。 しかし、この記事の目標は、ソースから最初のソフトウェアをコンパイルできるようにすることですので、いくつかの一般的な問題を調査するのに時間を割く価値があるかもしれません。 だから、私は再び全体の手順を行いますが、今回は新鮮で最小限のDebian9.0とCentOS7.0システムから、私が遭遇したエラーとそれらをどのように解決したかを Debian9.0″Stretch”から :~$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/node-bash: git: command not found
- 。0
- C.ソースコードからインストールされたソフトウェアを変更する
- /usr/local/bin
- パスを変更する
- E. ソースコードから新しくインストールされたソフトウェアを削除する方法
- 待っていますか? 依存地獄はどこにあったのですか?最後のコメントとして、独自のカスタムソフトウェアのコンパイルについて読んだ場合、依存関係の地獄について聞いたことがあるかもしれません。 これは、ソフトウェアを正常にコンパイルする前に、まず前提条件のライブラリをコンパイルする必要があるという厄介な状況のニックネームです。
ステップ1:GitHubからソースコードを取得する
多くのオープンソースプロジェクトと同様に、NodeJSのソースはGitHubにあります。https://github.com/nodejs/node
だから、そこに直接行きましょう。
GitHub、git、または他のバージョン管理システムに精通していない場合は、リポジトリには、ソフトウェアの現在のソースだけでなく、そのソフトウェアに長年にわたって行われたすべての変更の履歴が含まれています。 最終的には、そのプロジェクトのために書かれた非常に最初の行まで。 開発者にとって、その歴史を維持することには多くの利点があります。 今日の私たちにとって、主なものは、彼らが任意の時点であったように、プロジェクトのソースを取得することができるようになりますです。 より正確には、私が望む8.1.1バージョンがリリースされたときのようにソースを取得することができます。 それ以来、多くの変更があったとしても。
GitHubでは、”branch”ボタ “Branch”と”tags”はGitの幾分関連した概念です。 基本的に、開発者は、新しい機能の作業を開始したり、リリースを公開したりするときなど、プロジェクト履歴の重要なイベントを追跡するために、”branch”と”tags” 私はここで詳細には触れませんが、あなたが知る必要があるのは、タグ付きのバージョンを探していることだけです”v8.1.1″
を選択した後、”v8.1.1″タグ、ページが更新され、最も明白な変更は、タグがURLの一部として表示されるようになりました。 さらに、ファイルの変更日も異なることがわかります。 現在表示されているソースツリーは、v8.1.1タグが作成された時点に存在していたものです。 ある意味では、gitのようなバージョン管理ツールをタイムトラベルマシンと考えることができ、プロジェクト履歴を行き来することができます。
この時点で、NodeJS8.1.1のソー あなたは、プロジェクトのZIPアーカイブをダウンロードすることを示唆し、大きな青いボタンを見逃すことはできません。 私については、説明のためにコマンドラインからZIPをダウンロードして抽出します。 しかし、GUIツールを使用したい場合は、代わりにそれを行うことを躊躇しないでください:
wget https://github.com/nodejs/node/archive/v8.1.1.zipunzip v8.1.1.zipcd node-8.1.1/
ZIPアーカイブのダウンロードは素晴ら しかし、「プロのように」したい場合は、git
ツールを直接使用してソースをダウンロードすることをお勧めします。 それは全く複雑ではありません—そして、それはあなたが頻繁に遭遇するツールとの素敵な最初の接触になります:
# first ensure git is installed on your systemsh$ sudo apt-get install git# Make a shallow clone the NodeJS repository at v8.1.1sh$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/nodesh$ cd node/
ところで、問題がある場合は、この記事の最初の部分を一般的な紹介として検討してください。 後で、一般的な問題のトラブルシューティングを支援するために、DebianベースとRedHatベースのディストリビューションの詳細な説明があります。
とにかく、git
またはZIPアーカイブとしてソースをダウンロードするたびに、現在のディレクトリにまったく同じソースファイルがあるはずです。
sh$ lsandroid-configure BUILDING.md common.gypi doc Makefile srcAUTHORS CHANGELOG.md configure GOVERNANCE.md node.gyp testbenchmark CODE_OF_CONDUCT.md CONTRIBUTING.md lib node.gypi toolsBSDmakefile COLLABORATOR_GUIDE.md deps LICENSE README.md vcbuild.bat
ステップ2:プログラムのビルドシステムを理解する
通常は”ソースのコンパイル”について話しますが、コンパイルはソースを生成するために必要なフェーズの一つに過ぎません。そのソースからの作業ソフトウェア。 ビルドシステムは、いくつかのコマンドを発行するだけで完全にソフトウェアを構築するために、これらの異なるタスクを自動化し、明確にするた
概念が単純であれば、現実はやや複雑です。 異なるプロジェクトやプログラミング言語は、異なる要件を持っている可能性があるため。 またはプログラマーの好みのために。 またはサポートされているプラットフォーム。 または歴史的な理由のために。 または…または。. 別のビルドシステムを選択または作成する理由のほぼ無限のリストがあります。 そこに使用される多くの異なった解決があることを言うためにすべて。
NodeJSはGNUスタイルのビルドシステムを使用していますが、これはオープンソースコミュニティで人気のある選択肢であり、再びあなたの旅を始める
ビルドシステムの作成とチューニングはかなり複雑な作業ですが、”エンドユーザー”にとっては、GNUスタイルのビルドシステムはconfigure
make
の二つのツールを使用することでタスクを容易にします。
configure
ファイルは、最終的に現在のプラットフォームの特殊性を扱う、プロジェクトを構築することができることを確認するために、宛先システp>
典型的なconfigure
Makefile
make
ツールは、Unixライクなシステムで利用可能なPOSIXツールです。 プロジェクト固有のMakefile
を読み取り、プログラムをビルドおよびインストールするために必要な操作を実行します。しかし、Linuxの世界ではいつものように、特定のニーズに合わせてビルドをカスタマイズすることにはまだ寛大さがあります。
./configure --help
configure -help
コマンドは、使用可能なすべての設定オプションを表示します。 繰り返しますが、これは非常にプロジェクト固有です。 そして、正直に言うと、それぞれの設定オプションの意味を完全に理解する前に、プロジェクトを掘り下げる必要があることがあります。しかし、あなたが知っておく必要がある少なくとも一つの標準的なGNU Autotoolsオプションがあります:--prefix
オプション。 これは、ファイルシステムの階層と、ソフトウェアのインストール場所に関係しています。ステップ3
ステップ3
ステップ3: Fhs
典型的なディストリビューション上のLinuxファイルシステム階層は、ほとんどがFilesystem Hierarchy Standard(FHS)
に準拠しています。/usr
/tmp
/var
など。GNU Autotoolsおよび他のほとんどのビルドシステムを使用する場合、新しいソフトウェアのデフォルトのインストール場所は/usr/local
FSHによると、「/usr/local階層は、ソフトウェアをローカルにインストールするときにシステム管理者が使用するためのものですか? これは、システムソフトウェアが更新されたときに上書きされてから安全である必要があります。 これは、ホストのグループ間で共有可能であるが、/usrにはないプログラムやデータに使用することができます。”
/usr/local
/usr/local/bin
/usr/local/lib
/usr/local/share
/usr/local/share
/usr/local
/usr/local/bin
/usr/local/lib
/usr/bin
/opt
サブツリーにカスタムソフトウェアをインストールすることを好みます。 もう一度、FHSを引用するには:
_”/optは、アドオンアプリケーションソフトウェアパッケージのインストール用に予約されています。
/optにインストールされるパッケージは、その静的ファイルを別の/opt/<>または/opt/<>>>>>><パッケージ><>はプロバイダのlanana登録名です。そこで、カスタムNodeJSインストール用に/opt
のサブディレクトリを作成します。 そして、いつかそのソフトウェアを削除したい場合は、そのディレクトリを削除するだけです。
sh$ sudo mkdir /opt/node-v8.1.1sh$ sudo ln -sT node-v8.1.1 /opt/node# What is the purpose of the symbolic link above?# Read the article till the end--then try to answer that# question in the comment section!sh$ ./configure --prefix=/opt/node-v8.1.1sh$ make -j9 && echo ok# -j9 means run up to 9 parallel tasks to build the software.# As a rule of thumb, use -j(N+1) where N is the number of cores# of your system. That will maximize the CPU usage (one task per# CPU thread/core + a provision of one extra task when a process# is blocked by an I/O operation.
make
コマンドが完了した後に「ok」以外のものは、ビルドプロセス中にエラーが発生したことを意味します。 -j
make
-j
オプションはありません。 最後に、コンパイルが終了したら、次のコマンドを実行してソフトウェアをその場所にインストールできます。
sh$ sudo make install
それをテストします。
sh$ /opt/node/bin/node --versionv8.1.1
B.ソースコードからのインストール中に問題が発生した場合は?上で説明したのは、よく文書化されたプロジェクトの”ビルド命令”ページで見ることができるものです。 しかし、この記事の目標は、ソースから最初のソフトウェアをコンパイルできるようにすることですので、いくつかの一般的な問題を調査するのに時間を割く価値があるかもしれません。 だから、私は再び全体の手順を行いますが、今回は新鮮で最小限のDebian9.0とCentOS7.0システムから、私が遭遇したエラーとそれらをどのように解決したかを
Debian9.0″Stretch”から
:~$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/node-bash: git: command not found
:~$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/node-bash: git: command not found
この問題は診断と解決が非常に簡単です。 パッケージをインストールするだけです:
:~$ sudo apt-get install git
:~$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/node && echo okok
:~/node$ sudo mkdir /opt/node-v8.1.1:~/node$ sudo ln -sT node-v8.1.1 /opt/node
ここで問題はありません。P>
:~/node$ ./configure --prefix=/opt/node-v8.1.1/WARNING: failed to autodetect C++ compiler version (CXX=g++)WARNING: failed to autodetect C compiler version (CC=gcc)Node.js configure error: No acceptable C compiler found! Please make sure you have a C compiler installed on your system and/or consider adjusting the CC environment variable if you installed it in a non-standard prefix.
明らかに、プロジェクトをコンパイルするには、コンパイラが必要です。 NodeJSはC++言語を使用して記述されているため、C++コンパイラが必要です。 ここでは、その目的のためにGNU C++コンパイラである`g++’をインストールします。
:~/node$ sudo apt-get install g++:~/node$ ./configure --prefix=/opt/node-v8.1.1/ && echo okok
:~/node$ make -j9 && echo ok-bash: make: command not found
もう1つ 同じ症状。 同じ解決策:
:~/node$ sudo apt-get install make:~/node$ make -j9 && echo okok
:~/node$ sudo make install:~/node$ /opt/node/bin/node --versionv8.1.1
成功!
注意してください。
: コンパイルの問題を診断する方法と、それらの問題を解決するための典型的な解決策を示すために、さまざまなツールを1つずつインストールしました。 しかし、トピックの詳細情報を検索したり、他のチュートリアルを読んだりすると、ほとんどのディストリビューションには、ソフトウェアのコンパイルに使 Debianベースのシステムでは、おそらくその目的のためのbuild-essentialsパッケージに遭遇するでしょう。 そして、Red-Hatベースのディストリビューションでは、それは”開発ツール”グループになります。CentOS7から
。0
~]$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/node-bash: git: command not found
コマンドが見つかりませんか? yum
パッケージマネージャーを使用してインストールするだけです:
~]$ sudo yum install git
~]$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/node && echo okok
~]$ sudo mkdir /opt/node-v8.1.1 ~]$ sudo ln -sT node-v8.1.1 /opt/node
~]$ cd node node]$ ./configure --prefix=/opt/node-v8.1.1/WARNING: failed to autodetect C++ compiler version (CXX=g++)WARNING: failed to autodetect C compiler version (CC=gcc)Node.js configure error: No acceptable C compiler found! Please make sure you have a C compiler installed on your system and/or consider adjusting the CC environment variable if you installed it in a non-standard prefix.
あなたはそれを推測します:nodejsはc++言語を使用して書かれていますが、私のシステムには対応するコンパイラがありません。 救助にヤム。 私は通常のCentOSユーザーではないので、実際にはインターネット上でg++コンパイラを含むパッケージの正確な名前を検索する必要がありました。 私をそのページに導いてくれました: https://superuser.com/questions/590808/yum-install-gcc-g-doesnt-work-anymore-in-centos-6-4
node]$ sudo yum install gcc-c++ node]$ ./configure --prefix=/opt/node-v8.1.1/ && echo okok
node]$ make -j9 && echo okok
node]$ sudo make install && echo okok
node]$ /opt/node/bin/node --versionv8.1.1
成功しました。 また!.
C.ソースコードからインストールされたソフトウェアを変更する
配布リポジトリでは利用できない非常に特定のバージョンが必要な場合や、バグを修正したり機能を追加したりするためにプログラムを変更したい場合は、ソースからソフトウェアをインストールすることができます。 結局のところ、オープンソースは、すべての変更を行うことについてです。 だから、私はあなたがあなた自身のソフトウェアをコンパイルすることができます今、あなたが手元に持っている力の味を与えるために、この機ここでは、NodeJSのソースにマイナーな変更を加えます。 そして、私たちの変更がコンパイルされたバージョンのソフトウェアに組み込まれるかどうかを確認します:
お気に入りのテキストエディタ(vim、nano、gedit、…)でファイルnode/src/node.cc
を開きます。 そして、そのコードの断片を見つけようとします:
if (debug_options.ParseOption(argv, arg)) { // Done, consumed by DebugOptions::ParseOption(). } else if (strcmp(arg, "--version") == 0 || strcmp(arg, "-v") == 0) { printf("%s\n", NODE_VERSION); exit(0); } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { PrintHelp(); exit(0); }
ファイルの3830行目の周りにあります。 次に、printf
を含む行を変更して、代わりにそれに一致するようにします:
printf("%s (compiled by myself)\n", NODE_VERSION);
次に、端末に戻ります。 さらに進む前に、そしてgitの背後にある力についてもう少し洞察を与えるために、正しいファイルを変更したかどうかを確認できます。
diff --git a/src/node.cc b/src/node.ccindex bbce1022..a5618b57 100644--- a/src/node.cc+++ b/src/node.cc@@ -3828,7 +3828,7 @@ static void ParseArgs(int* argc, if (debug_options.ParseOption(argv, arg)) { // Done, consumed by DebugOptions::ParseOption(). } else if (strcmp(arg, "--version") == 0 || strcmp(arg, "-v") == 0) {- printf("%s\n", NODE_VERSION);+ printf("%s (compiled by myself)\n", NODE_VERSION); exit(0); } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { PrintHelp();
変更する前と同じように、行の前に”—”(マイナス記号)が表示されるはずです。 変更後の行の前に”+”(プラス記号)を付けます。これで、ソフトウェアを再コンパイルして再インストールします。
make -j9 && sudo make install && echo okok
今回は、失敗する唯一の理由は、コードの変更中にタイプミスを このような場合は、テキストエディタでnode/src/node.cc
ファイルを再度開き、間違いを修正してください。新しい変更されたNodeJSバージョンをコンパイルしてインストールすると、変更が実際にソフトウェアに組み込まれているかどうかを確認できます。
:~/node$ /opt/node/bin/node --versionv8.1.1 (compiled by myself)
おめでとう! あなたは、オープンソースのプログラムにあなたの最初の変更を加えました!d.シェルにカスタムビルドソフトウェアを見つけさせる
バイナリファイルへの絶対パスを指定することで、新しくコンパイルされたNodeJSソフp>
/opt/node/bin/node
それは動作します。 しかし、これは控えめに言っても迷惑です。 それを修正するには、実際には2つの一般的な方法があります。
バイナリファイルへの絶対パスを指定するという厄介な問題を解決するには、実際には二つの一般的な方法がありますが、それらを理解するためには、まずシェルがPATH環境変数で指定されたディレクトリ内でのみ実行可能ファイルを検索することによって実行可能ファイルを検索することを知っている必要があります。
:~/node$ echo $PATH/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
ここで、そのDebianシステムでは、コマンド名の一部として明示的にディレクトリを指定しない場合、シェルは最初に/usr/local/bin
/usr/bin
/usr/bin
/usr/bin
/usr/bin
/usr/bin
/bin
/usr/local/games
/usr/games
に見つからない場合、見つからない場合…シェルはエラー”コマンドが見つかりません”を報告
それを考えると、シェルからコマンドにアクセスできるようにする2つの方法があります: すでに構成されているPATH
PATH
に追加します。
/usr/local/bin
ノードバイナリ実行可能ファイルを/opt/node/bin
/usr/local/bin
/opt/node/
に属する他の必要なコンポーネントを見つけることができなくなるため、悪い考えになります(これは一般的な方法です)。ソフトウェアは、独自の場所に相対的にそのリソースファイルを検索する)。
だから、それを行う伝統的な方法は、シンボリックリンクを使用することです:
:~/node$ sudo ln -sT /opt/node/bin/node /usr/local/bin/node:~/node$ which -a node || echo not found/usr/local/bin/node:~/node$ node --versionv8.1.1 (compiled by myself)
これは、ソフトウェアパッケージがいくつかのよく知られている実行可能プログラムで作られている場合は特に、シンプルで効果的な解決策です。 たとえば、NodeJSに精通している場合は、npm
/usr/local/bin
からシンボリックリンクする必要があります。 しかし、私は運動としてあなたにそれを聞かせてください。
パスを変更する
まず、前の解決策を試した場合は、以前に作成したノードのシンボリックリンクを削除してクリア状態から開始します。
:~/node$ sudo rm /usr/local/bin/node:~/node$ which -a node || echo not foundnot found
そして今、あなたのPATH
:
:~/node$ export PATH="/opt/node/bin:${PATH}":~/node$ echo $PATH/opt/node/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PATH
:
:~/node$ export PATH="/opt/node/bin:${PATH}":~/node$ echo $PATH/opt/node/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PATH
PATH
PATH
簡単に言うと、PATH
/opt/node/bin
/opt/node/bin
which
コマンドを使用することを確認できます。
:~/node$ which -a node || echo not found/opt/node/bin/node:~/node$ node --versionv8.1.1 (compiled by myself)
シンボリックリンクを/usr/local/bin
に作成するとすぐに”link”ソリューションは永続的ですが、PATH
PATH
パーマネントに変更を加える方法についていくつかの研究を行うためにあなたを残します。 ヒントとして、それはあなたの”プロフィール”に関係しています。 あなたが解決策を見つけた場合は、以下のコメントセクションを使用して、他の読者とそれを共有することを躊躇しないでください!
E. ソースコードから新しくインストールされたソフトウェアを削除する方法
カスタムコンパイルされたNodeJSソフトウェアは/opt/node-v8.1.1
ディレrm -rf
危険なカクテルです! 「Enter」キーを押す前に、常にコマンドを2回確認してください。 間違ったディレクトリを削除すると、確認メッセージが表示されず、元に戻すことはできません…
その後、PATH
/usr/local/bin
あなたはそれらをすべて削除する必要があります:
:~/node$ sudo find /usr/local/bin \ -type l \ -ilname "/opt/node/*" \ -print -delete/usr/local/bin/node
待っていますか? 依存地獄はどこにあったのですか?最後のコメントとして、独自のカスタムソフトウェアのコンパイルについて読んだ場合、依存関係の地獄について聞いたことがあるかもしれません。 これは、ソフトウェアを正常にコンパイルする前に、まず前提条件のライブラリをコンパイルする必要があるという厄介な状況のニックネームです。
ディストリビューションのパッケージメンテナの仕事の一部は、実際にその依存関係の地獄を解決し、システムのさまざまなソフトウェアが互換性この記事では、NodeJSには事実上依存関係がないため、意図的にNodeJSをインストールすることを選択しました。 実際には依存関係があるため、私は「事実上」と言いました。 しかし、これらの依存関係のソースコードはプロジェクトのソースリポジトリ(node/deps
サブディレクトリ)に存在するため、手動でダウンロードしてイ