97人妻精品免费_女同久久国产另类av_小小影视在线播放放映看免费_中文字幕国产精品综合一区_亞洲AV無碼歐洲AV無碼網站_婷婷四月开心色房播播网_日韩午夜无码不卡视频_成人綜合在線觀看_波多野结衣绝顶大潮喷_不卡无码在线观看

新超越科技官方網(wǎng)站--專注企業(yè)管理軟件ERP信息化服務(wù)
描述
管家婆輝煌普普版
入門(mén)級(jí)進(jìn)銷存管理軟件
管家婆輝煌普普版
描述
管家婆輝煌普普版是一款面向小微型企業(yè)應(yīng)用的入門(mén)級(jí)進(jìn)銷存管理軟件。該軟件將企業(yè)的物流賬和錢(qián)流賬統(tǒng)一起來(lái)。自動(dòng)分類統(tǒng)計(jì)和匯總,幫助企業(yè)老板經(jīng)理實(shí)現(xiàn)全面管賬,明明白白做生意。

源代碼怎么使用,源代碼生成app教程

瀏覽:17317 時(shí)間:2023-11-01 分類:行業(yè)資訊
Linux發(fā)行版的一個(gè)最大的優(yōu)點(diǎn)就是它的包管理器和相關(guān)的軟件庫(kù)。通過(guò)它們提供的資源和工具,你才能夠以完全自動(dòng)化的方式在你的計(jì)算機(jī)上下載和安裝軟件。 但是,盡管付出了很多的努力,包維護(hù)者仍然沒(méi)法照顧好每種情況,也不可能將所有的可用軟件都打包進(jìn)去。因此,仍然存在需要你自已去編譯和安裝一個(gè)新軟件的情形。對(duì)于我來(lái)說(shuō),到目前為止,最主要的原因是,我編譯一些軟件是我需要去運(yùn)行一個(gè)特定的版本?;蛘呤俏蚁肴バ薷脑?..

Linux 發(fā)行版的一個(gè)最大的優(yōu)點(diǎn)就是它的包管理器和相關(guān)的軟件庫(kù)。通過(guò)它們提供的資源和工具,你才能夠以完全自動(dòng)化的方式在你的計(jì)算機(jī)上下載和安裝軟件。

但是,盡管付出了很多的努力,包維護(hù)者仍然沒(méi)法照顧好每種情況,也不可能將所有的可用軟件都打包進(jìn)去。因此,仍然存在需要你自已去編譯和安裝一個(gè)新軟件的情形。對(duì)于我來(lái)說(shuō),到目前為止,最主要的原因是,我編譯一些軟件是我需要去運(yùn)行一個(gè)特定的版本?;蛘呤俏蚁肴バ薷脑创a或使用一些想要的編譯選項(xiàng)。

如果你也屬于后一種情況,那你已經(jīng)知道你應(yīng)該怎么做了。但是,對(duì)于絕大多數(shù)的 Linux 用戶來(lái)說(shuō),第一次從源代碼中編譯和安裝一個(gè)軟件看上去像是一個(gè)入門(mén)儀式:它讓很多人感到恐懼;但是,如果你能克服困難,你將可能進(jìn)入一個(gè)全新的世界,并且,如果你做到了,那么你將成為社區(qū)中享有特權(quán)的一部分人。

? 建議閱讀:怎樣在 Ubuntu 中安裝和刪除軟件(完全指南)[1]

A. 在 Linux 中從源代碼開(kāi)始安裝軟件

這正是我們要做的。因?yàn)檫@篇文章的需要,我要在我的系統(tǒng)上安裝 NodeJS[2] 8.1.1。它是個(gè)完全真實(shí)的版本。這個(gè)版本在 Debian 倉(cāng)庫(kù)中沒(méi)有:

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

第 1 步:從 GitHub 上獲取源代碼

像大多數(shù)開(kāi)源項(xiàng)目一樣,NodeJS 的源代碼可以在 GitHub:https://github.com/nodejs/node 上找到。

所以,我們直接開(kāi)始吧。

The NodeJS official GitHub repository

如果你不熟悉 GitHub[4],git[5] 或者提到的其它 版本管理系統(tǒng)[6]包含了這個(gè)軟件的源代碼,以及多年來(lái)對(duì)該軟件的所有修改的歷史。甚至可以回溯到該軟件的最早版本。對(duì)于開(kāi)發(fā)者來(lái)說(shuō),保留它的歷史版本有很多好處。如今對(duì)我來(lái)說(shuō),其中一個(gè)好處是可以得到任何一個(gè)給定時(shí)間點(diǎn)的項(xiàng)目源代碼。更準(zhǔn)確地說(shuō),我可以得到我所要的 8.1.1 發(fā)布時(shí)的源代碼。即便從那之后他們有了很多的修改。

Choose the v8.1.1 tag in the NodeJS GitHub repository

在 GitHub 上,你可以使用 “branch” (分支)按鈕導(dǎo)航到這個(gè)軟件的不同版本?!胺种А?和 “標(biāo)簽” 是 Git 中一些相關(guān)的概念[7]??偟膩?lái)說(shuō),開(kāi)發(fā)者創(chuàng)建 “分支” 和 “標(biāo)簽” 來(lái)在項(xiàng)目歷史中對(duì)重要事件保持跟蹤,比如當(dāng)他們啟用一個(gè)新特性或者發(fā)布一個(gè)新版本時(shí)。在這里先不詳細(xì)介紹了,你現(xiàn)在只需要知道我在找被標(biāo)記為 “v8.1.1” 的版本。

The NodeJS GitHub repository as it was at the time the v8.1.1 tag was created

在選擇了 “v8.1.1” 標(biāo)簽后,頁(yè)面被刷新,最顯著的變化是標(biāo)簽現(xiàn)在作為 URL 的一部分出現(xiàn)。另外,你可能會(huì)注意到文件改變?nèi)掌谝灿兴煌?。你現(xiàn)在看到的源代碼樹(shù)是創(chuàng)建了 v8.1.1 標(biāo)簽時(shí)的代碼。在某種意義上,你也可以認(rèn)為像 git 這樣的版本管理工具是一個(gè)時(shí)光穿梭機(jī),允許你在項(xiàng)目歷史中來(lái)回穿梭。

NodeJS GitHub repository download as a ZIP button

此時(shí),我們可以下載 NodeJS 8.1.1 的源代碼。你不要忘記去點(diǎn)那個(gè)建議的大的藍(lán)色按鈕來(lái)下載一個(gè)項(xiàng)目的 ZIP 壓縮包。對(duì)于我來(lái)說(shuō),為講解的目的,我從命令行中下載并解壓這個(gè) ZIP 壓縮包。但是,如果你更喜歡使用一個(gè) GUI[8] 工具,不用擔(dān)心,你可以取代下面的命令方式:

wget https://github.com/nodejs/node/archive/v8.1.1.zipunzip v8.1.1.zipcd node-8.1.1/

下載一個(gè) ZIP 包就可以,但是如果你希望“像個(gè)專家一樣”,我建議你直接使用 工具去下載源代碼。它一點(diǎn)也不復(fù)雜 — 并且如果你是第一次使用該工具,它將是一個(gè)很好的開(kāi)端,你以后將經(jīng)常用到它:

# 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/

順便說(shuō)一下,如果你有任何問(wèn)題,這篇文章的第一部分只是做一個(gè)總體介紹而已。后面,為了幫你排除常見(jiàn)問(wèn)題,我們將基于 Debian 和基于 RedHat 的發(fā)行版更詳細(xì)地解釋。

不管怎樣,在你使用 或者作為一個(gè) ZIP 壓縮包下載了源代碼后,在當(dāng)前目錄下就有了同樣的源代碼文件:

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 步:理解程序的構(gòu)建系統(tǒng)

構(gòu)建系統(tǒng)就是我們通常所說(shuō)的“編譯源代碼”,其實(shí),編譯只是從源代碼中生成一個(gè)可使用的軟件的其中一個(gè)階段。構(gòu)建系統(tǒng)是一套工具,用于自動(dòng)處置不同的任務(wù),以便可以僅通過(guò)幾個(gè)命令就能構(gòu)建整個(gè)軟件。

雖然概念很簡(jiǎn)單,實(shí)際上編譯做了很多事情。因?yàn)椴煌捻?xiàng)目或者編程語(yǔ)言也許有不同的要求,或者因?yàn)榫幊陶叩暮脨?,或者因?yàn)橹С值钠脚_(tái)、或者因?yàn)闅v史的原因,等等等等 … 選擇或創(chuàng)建另外一個(gè)構(gòu)建系統(tǒng)的原因幾乎數(shù)不清。這方面有許多種不同的解決方案。

NodeJS 使用一種 GNU 風(fēng)格的構(gòu)建系統(tǒng)[9]。這在開(kāi)源社區(qū)中這是一個(gè)很流行的選擇。由此開(kāi)始,你將進(jìn)入一段精彩的旅程。

寫(xiě)出和調(diào)優(yōu)一個(gè)構(gòu)建系統(tǒng)是一個(gè)非常復(fù)雜的任務(wù)。但是,作為 “終端用戶” 來(lái)說(shuō),GNU 風(fēng)格的構(gòu)建系統(tǒng)使用兩個(gè)工具讓他們免于此難: 和 。

文件是個(gè)項(xiàng)目專用的腳本,它將檢查目標(biāo)系統(tǒng)的配置和可用功能,以確保該項(xiàng)目可以被構(gòu)建,并最終吻合當(dāng)前平臺(tái)的特性。

一個(gè)典型的 任務(wù)的重要部分是去構(gòu)建 。這個(gè)文件包含了有效構(gòu)建項(xiàng)目所需的指令。

另一方面, 工具[10],這是一個(gè)可用于任何類 Unix 系統(tǒng)的 POSIX 工具。它將讀取項(xiàng)目專用的 然后執(zhí)行所需的操作去構(gòu)建和安裝你的程序。

但是,在 Linux 的世界中,你仍然有一些定制你自己專用的構(gòu)建的理由。

./configure --help

命令將展示你可用的所有配置選項(xiàng)。再?gòu)?qiáng)調(diào)一下,這是非常的項(xiàng)目專用。說(shuō)實(shí)話,有時(shí)候,在你完全理解每個(gè)配置選項(xiàng)的作用之前,你需要深入到項(xiàng)目中去好好研究。

不過(guò),這里至少有一個(gè)標(biāo)準(zhǔn)的 GNU 自動(dòng)化工具選項(xiàng)是你該知道的,它就是眾所周知的 選項(xiàng)。它與文件系統(tǒng)的層次結(jié)構(gòu)有關(guān),它是你軟件要安裝的位置。

第 3 步:文件系統(tǒng)層次化標(biāo)準(zhǔn)(FHS)

大部分典型的 Linux 發(fā)行版的文件系統(tǒng)層次結(jié)構(gòu)都遵從 文件系統(tǒng)層次化標(biāo)準(zhǔn)(FHS)[11]。

這個(gè)標(biāo)準(zhǔn)說(shuō)明了你的系統(tǒng)中各種目錄的用途,比如,、、 等等。

當(dāng)使用 GNU 自動(dòng)化工具 和大多數(shù)其它的構(gòu)建系統(tǒng) 時(shí),它會(huì)把新軟件默認(rèn)安裝在你的系統(tǒng)的 目錄中。這是依據(jù) FHS 中 “ 層級(jí)是為系統(tǒng)管理員本地安裝軟件時(shí)使用的,它在系統(tǒng)軟件更新覆蓋時(shí)是安全的。它也可以用于存放在一組主機(jī)中共享,但又沒(méi)有放到 /usr 中的程序和數(shù)據(jù)”,因此,它是一個(gè)非常好的選擇。

層級(jí)以某種方式復(fù)制了根目錄,你可以在 這里找到可執(zhí)行程序,在 中找到庫(kù),在 中找到架構(gòu)無(wú)關(guān)的文件,等等。

使用 樹(shù)作為你定制安裝的軟件位置的唯一問(wèn)題是,你的軟件的文件將在這里混雜在一起。尤其是你安裝了多個(gè)軟件之后,將很難去準(zhǔn)確地跟蹤 和 中的哪個(gè)文件到底屬于哪個(gè)軟件。它雖然不會(huì)導(dǎo)致系統(tǒng)的問(wèn)題。畢竟, 也是一樣混亂的。但是,有一天你想去卸載一個(gè)手工安裝的軟件時(shí)它會(huì)將成為一個(gè)問(wèn)題。

要解決這個(gè)問(wèn)題,我通常喜歡安裝定制的軟件到 子目錄下。再次引用 FHS:

“ 是為安裝附加的應(yīng)用程序軟件包而保留的。

包安裝在 下的軟件包必須將它的靜態(tài)文件放在單獨(dú)的 或者 目錄中,此處 是所說(shuō)的那個(gè)軟件名的名字,而 處是提供者的 LANANA 注冊(cè)名字?!保↙CTT 譯注:LANANA 是指 The Linux Assigned Names And Numbers Authority[12]。 )

因此,我們將在 下創(chuàng)建一個(gè)子目錄,用于我們定制的 NodeJS 安裝。并且,如果有一天我想去卸載它,我只是很簡(jiǎn)單地去刪除那個(gè)目錄:

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.

在你運(yùn)行完成 命令之后,如果有任何的除了 “ok” 以外的信息,將意味著在構(gòu)建過(guò)程中有錯(cuò)誤。當(dāng)我們使用一個(gè) 選項(xiàng)去運(yùn)行并行構(gòu)建時(shí),在構(gòu)建系統(tǒng)的大量輸出過(guò)程中,檢索錯(cuò)誤信息并不是件很容易的事。

在這種情況下,只能是重新開(kāi)始 ,并且不要使用 選項(xiàng)。這樣錯(cuò)誤將會(huì)出現(xiàn)在輸出信息的最后面:

sh$ make

最終,編譯結(jié)束后,你可以運(yùn)行這個(gè)命令去安裝你的軟件:

sh$ sudo make install

然后測(cè)試它:

sh$ /opt/node/bin/node --versionv8.1.1

B. 如果在源代碼安裝的過(guò)程中出現(xiàn)錯(cuò)誤怎么辦?

我上面介紹的大多是你能在文檔完備的項(xiàng)目的“構(gòu)建指令”頁(yè)面上看到。但是,本文的目標(biāo)是讓你從源代碼開(kāi)始去編譯你的第一個(gè)軟件,它可能要花一些時(shí)間去研究一些常見(jiàn)的問(wèn)題。因此,我將再次重新開(kāi)始一遍整個(gè)過(guò)程,但是,這次是在一個(gè)最新的、最小化安裝的 Debian 9.0 和 CentOS 7.0 系統(tǒng)上。因此,你可能看到我遇到的錯(cuò)誤以及我怎么去解決它。

從 Debian 9.0 中 “Stretch” 開(kāi)始

itsfoss@debian:~$ git clone --depth 1 --branch v8.1.1 https://github.com/nodejs/node-bash: git: command not found

這個(gè)問(wèn)題非常容易去診斷和解決。去安裝這個(gè) 包即可:

itsfoss@debian:~$ sudo apt-get install git
itsfoss@debian:~$ git clone --depth 1 --branch v8.1.1 https://github.com/nodejs/node && echo ok[...]ok
itsfoss@debian:~/node$ sudo mkdir /opt/node-v8.1.1itsfoss@debian:~/node$ sudo ln -sT node-v8.1.1 /opt/node

現(xiàn)在沒(méi)有問(wèn)題了。

itsfoss@debian:~/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.

很顯然,編譯一個(gè)項(xiàng)目,你需要一個(gè)編譯器。NodeJS 是使用 C++ 語(yǔ)言[13] 寫(xiě)的,我們需要一個(gè) C++ 編譯器[14]。在這里我將安裝 ,它就是為這個(gè)目的寫(xiě)的 GNU C++ 編譯器:

itsfoss@debian:~/node$ sudo apt-get install g++itsfoss@debian:~/node$ ./configure --prefix=/opt/node-v8.1.1/ && echo ok[...]ok
itsfoss@debian:~/node$ make -j9 && echo ok-bash: make: command not found

還差一個(gè)其它工具。同樣的癥狀。同樣的解決方案:

itsfoss@debian:~/node$ sudo apt-get install makeitsfoss@debian:~/node$ make -j9 && echo ok[...]ok
itsfoss@debian:~/node$ sudo make install[...]itsfoss@debian:~/node$ /opt/node/bin/node --versionv8.1.1

成功!

請(qǐng)注意:我將一次又一次地安裝各種工具去展示怎么去診斷編譯問(wèn)題,以及展示怎么去解決這些問(wèn)題。但是,如果你搜索關(guān)于這個(gè)主題的更多文檔,或者讀其它的教程,你將發(fā)現(xiàn),很多發(fā)行版有一個(gè) “meta-packages”,它包羅了安裝一些或者全部的用于編譯軟件的常用工具。在基于 Debian 的系統(tǒng)上,你或許遇到過(guò) build-essentials[15] 包,它就是這種用作。在基于 Red Hat 的發(fā)行版中,它將是 “Development Tools” 組。

在 CentOS 7.0 上

[itsfoss@centos ~]$ git clone --depth 1 --branch v8.1.1 https://github.com/nodejs/node-bash: git: command not found

命令沒(méi)有找到?可以用 包管理器去安裝它:

[itsfoss@centos ~]$ sudo yum install git
[itsfoss@centos ~]$ git clone --depth 1 --branch v8.1.1 https://github.com/nodejs/node && echo ok[...]ok
[itsfoss@centos ~]$ sudo mkdir /opt/node-v8.1.1[itsfoss@centos ~]$ sudo ln -sT node-v8.1.1 /opt/node
[itsfoss@centos ~]$ cd node[itsfoss@centos 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++ 語(yǔ)言寫(xiě)的,但是,我的系統(tǒng)缺少合適的編譯器。Yum 可以幫到你。因?yàn)椋也皇且粋€(gè)合格的 CentOS 用戶,我實(shí)際上是在互聯(lián)網(wǎng)上搜索到包含 g++ 編譯器的包的確切名字的。這個(gè)頁(yè)面指導(dǎo)了我:https://superuser.com/questions/590808/yum-install-gcc-g-doesnt-work-anymore-in-centos-6-4 。

[itsfoss@centos node]$ sudo yum install gcc-c++[itsfoss@centos node]$ ./configure --prefix=/opt/node-v8.1.1/ && echo ok[...]ok
[itsfoss@centos node]$ make -j9 && echo ok[...]ok
[itsfoss@centos node]$ sudo make install && echo ok[...]ok
[itsfoss@centos node]$ /opt/node/bin/node --versionv8.1.1

再次成功!

C. 從源代碼中對(duì)要安裝的軟件做一些改變

從源代碼中安裝一個(gè)軟件,可能是因?yàn)槟愕姆职l(fā)倉(cāng)庫(kù)中沒(méi)有一個(gè)可用的特定版本?;蛘咭?yàn)槟阆肴?修改 那個(gè)程序。也可能是修復(fù)一個(gè) bug 或者增加一個(gè)特性。畢竟,開(kāi)源軟件這些都可以做到。因此,我將抓住這個(gè)機(jī)會(huì),讓你親自體驗(yàn)怎么去編譯你自己的軟件。

在這里,我將在 NodeJS 源代碼上做一個(gè)微小改變。然后,我們將看到我們的改變將被納入到軟件的編譯版本中:

 if (debug_options.ParseOption(argv[0], arg)) { // Done, consumed by DebugOptions::ParseOption(). } else if (strcmp(arg, "--version") == 0 || strcmp(arg, "-v") == 0) { printf("%sn", NODE_VERSION); exit(0); } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { PrintHelp(); exit(0); }

它在 文件的 3830 行[18] 附近。然后,修改包含 的行,將它替換成如下內(nèi)容:

 printf("%s (compiled by myself)n", NODE_VERSION);

然后,返回到你的終端。在繼續(xù)之前,為了對(duì)強(qiáng)大的 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[0], arg)) { // Done, consumed by DebugOptions::ParseOption(). } else if (strcmp(arg, "--version") == 0 || strcmp(arg, "-v") == 0) {- printf("%sn", NODE_VERSION);+ printf("%s (compiled by myself)n", NODE_VERSION); exit(0); } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { PrintHelp();

在你前面改變的那行之前,你將看到一個(gè) “-” (減號(hào)標(biāo)志)。而在改變之后的行前面有一個(gè) “+” (加號(hào)標(biāo)志)。

現(xiàn)在可以去重新編譯并重新安裝你的軟件了:

make -j9 && sudo make install && echo ok[...]ok

一旦你完成了新修改版本的 NodeJS 的編譯和安裝,就可以去檢查你的修改是否包含到軟件中:

itsfoss@debian:~/node$ /opt/node/bin/node --versionv8.1.1 (compiled by myself)

恭喜你!你對(duì)開(kāi)源程序做出了你的第一個(gè)改變!

D. 讓 shell 找到我們定制構(gòu)建的軟件

到目前為止,你可能注意到,我通常啟動(dòng)我新編譯的 NodeJS 軟件是通過(guò)指定到該二進(jìn)制文件的絕對(duì)路徑。

/opt/node/bin/node

這是可以正常工作的。但是,這樣太麻煩。實(shí)際上有兩種辦法可以去解決這個(gè)問(wèn)題。但是,去理解它們,你必須首先明白,你的 shell 定位可執(zhí)行文件是通過(guò)在環(huán)境變量[19] 中指定的目錄里面查找的。

itsfoss@debian:~/node$ echo $PATH/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

在這個(gè) Debian 系統(tǒng)上,如果你不指定一個(gè)精確的目錄做為命令名字的一部分,shell 將首先在 中查找可執(zhí)行程序;如果沒(méi)有找到,然后進(jìn)入 中查找;如果沒(méi)有找到,然后進(jìn)入 查找;如果沒(méi)有找到,然后進(jìn)入 查找;如果沒(méi)有找到,然后進(jìn)入 查找;如果沒(méi)有找到,那么,shell 將報(bào)告一個(gè)錯(cuò)誤,“command not found”。

由此,我們可以知道有兩種方法去確保命令可以被 shell 訪問(wèn)到:將它(該二進(jìn)制程序)增加到已經(jīng)配置好的 目錄中,或者將包含可執(zhí)行程序的目錄添加到 中。

從 /usr/local/bin 中添加一個(gè)鏈接

只是從 中 拷貝 NodeJS 二進(jìn)制可執(zhí)行文件到 是一個(gè)錯(cuò)誤的做法。因?yàn)椋绻@么做,該可執(zhí)行程序?qū)o(wú)法定位到在 中的需要的其它組件。(軟件以它自己的位置去定位它所需要的資源文件是常見(jiàn)的做法)

因此,傳統(tǒng)的做法是去使用一個(gè)符號(hào)鏈接:

itsfoss@debian:~/node$ sudo ln -sT /opt/node/bin/node /usr/local/bin/nodeitsfoss@debian:~/node$ which -a node || echo not found/usr/local/bin/nodeitsfoss@debian:~/node$ node --versionv8.1.1 (compiled by myself)

這一個(gè)簡(jiǎn)單而有效的解決辦法,尤其是,如果一個(gè)軟件包是由好幾個(gè)眾所周知的可執(zhí)行程序組成的,因?yàn)?,你將為每個(gè)用戶調(diào)用的命令創(chuàng)建一個(gè)符號(hào)鏈接。例如,如果你熟悉 NodeJS,你知道應(yīng)用的 組件,也應(yīng)該從 做個(gè)符號(hào)鏈接。我把這個(gè)留給你做練習(xí)。

修改 PATH

首先,如果你嘗試過(guò)前面的解決方案,請(qǐng)先移除前面創(chuàng)建的節(jié)點(diǎn)符號(hào)鏈接,去從一個(gè)干凈的狀態(tài)開(kāi)始:

itsfoss@debian:~/node$ sudo rm /usr/local/bin/nodeitsfoss@debian:~/node$ which -a node || echo not foundnot found

現(xiàn)在,這里有一個(gè)改變你的 的魔法命令:

itsfoss@debian:~/node$ export PATH="/opt/node/bin:${PATH}"itsfoss@debian:~/node$ echo $PATH/opt/node/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

簡(jiǎn)單說(shuō)就是,我用環(huán)境變量 之前的內(nèi)容前綴了一個(gè) 替換了其原先的內(nèi)容。因此,你可以想像一下,shell 將先進(jìn)入到 目錄中查找可執(zhí)行程序。我們也可以使用 命令去確認(rèn)一下:

itsfoss@debian:~/node$ which -a node || echo not found/opt/node/bin/nodeitsfoss@debian:~/node$ node --versionv8.1.1 (compiled by myself)

鑒于 “符號(hào)鏈接” 解決方案是永久的,只要?jiǎng)?chuàng)建到 的符號(hào)鏈接就行了,而對(duì) 的改變僅影響到當(dāng)前的 shell。你可以自己做一些研究,如何做到對(duì) 的永久改變。給你一個(gè)提示,可以將它寫(xiě)到你的 “profile” 中。如果你找到這個(gè)解決方案,不要猶豫,通過(guò)下面的評(píng)論區(qū)共享給其它的讀者!

E. 怎么去卸載剛才從源代碼中安裝的軟件

因?yàn)槲覀兌ㄖ凭幾g的 NodeJS 軟件全部在 目錄中,卸載它不需要做太多的工作,僅使用 命令去刪除那個(gè)目錄即可:

sudo rm -rf /opt/node-v8.1.1

注意: 和 是 “非常危險(xiǎn)的雞尾酒”!一定要在按下回車鍵之前多檢查幾次你的命令。你不會(huì)得到任何的確認(rèn)信息,并且如果你刪除了錯(cuò)誤的目錄它是不可恢復(fù)的 …

然后,如果你修改了你的 ,你可以去恢復(fù)這些改變。它一點(diǎn)也不復(fù)雜。

如果你從 創(chuàng)建了一個(gè)符號(hào)鏈接,你應(yīng)該去刪除它們:

itsfoss@debian:~/node$ sudo find /usr/local/bin -type l -ilname "/opt/node/*" -print -delete/usr/local/bin/node

等等? 依賴地獄在哪里?

作為最終的討論,如果你讀過(guò)有關(guān)的編譯定制軟件的文檔,你可能聽(tīng)到關(guān)于 依賴地獄dependency hell[20] 的說(shuō)法。那是在你能夠成功編譯一個(gè)軟件之前,對(duì)那種煩人情況的一個(gè)別名,你必須首先編譯一個(gè)前提條件所需要的庫(kù),它又可能要求其它的庫(kù),而這些庫(kù)有可能與你的系統(tǒng)上已經(jīng)安裝的其它軟件不兼容。

發(fā)行版的軟件包維護(hù)者的部分工作,就是實(shí)際去地解決那些依賴地獄,確保你的系統(tǒng)上的各種軟件都使用了兼容的庫(kù),并且按正確的順序去安裝。

在這篇文章中,我特意選擇了 NodeJS 去安裝,是因?yàn)樗鼛缀鯖](méi)有依賴。我說(shuō) “幾乎” 是因?yàn)?,?shí)際上,它 有 依賴。但是,這些源代碼的依賴已經(jīng)預(yù)置到項(xiàng)目的源倉(cāng)庫(kù)中(在 子目錄下),因此,在你動(dòng)手編譯之前,你不用手動(dòng)去下載和安裝它們。

熱門(mén)案例
×
img_load