问题描述
我使用apt-get install nodejs
安装了节点。然后,我用apt-get install npm
安装了npm。现在,当我尝试运行express
时,我得到了
$ express
/usr/bin/env: node: No such file or directory
如何解决此错误?
最佳思路
Ubuntu中有两个名称相似的软件包,即node和nodejs。
node
会这样做,
Description-en: Amateur Packet Radio Node program. The node program accepts TCP/IP and packet radio network connections and presents users with an interface that allows them to make gateway connections to remote hosts using a variety of amateur radio protocols.
nodejs
会这样做,
Description-en: Node.js event-based server-side javascript engine Node.js is similar in design to and influenced by systems like Ruby’s Event Machine or Python’s Twisted. It takes the event model a bit further – it presents the event loop as a language construct instead of as a library. Node.js is bundled with several useful libraries to handle server tasks : System, Events, Standard I/O, Modules, Timers, Child Processes, POSIX, HTTP, Multipart Parsing, TCP, DNS, Assert, Path, URL, Query Strings.
Fedora也遵循类似的软件包命名方案。因此,必须将nodejs
中的二进制文件从原始node
重命名为nodejs
。但是,从技术上讲,这不是可理解的:大多数nodejs程序(和npm安装的库)都假定节点二进制文件是node
。如果您想解决这个问题,最简单的方法就是将两者符号链接在一起。如果您采用这种方式,请不要安装用于处理业余分组无线设备的node
软件包。
sudo ln -s /usr/bin/nodejs /usr/local/bin/node
另外,对于节点,我建议使用n
而不安装node
。只需安装npm(将安装节点),然后删除npm,然后告诉apt清理它。为此,只需运行
sudo apt-get install npm
sudo npm install -g n
sudo n latest
sudo apt-get --purge remove npm
sudo apt-get autoremove
还有其他二进制发行版管理器,甚至可以使用诸如nvm
之类的shell脚本工作,但我个人更喜欢n
。可以将n
视为仅适用于一件事:将其安装到/usr/local/bin
的节点二进制文件。
为什么要删除npm?不是。 apt-get --purge remove
只能删除软件包管理器安装的内容。 n latest
在程序包管理器之外工作。如果执行此操作,则有两个npm,
-
由发行版(Debian /Ubuntu)使用
apt-get
安装的版本。 -
由
n latest
安装的版本。
使用发行版的旧版本毫无意义。而且,更糟糕的是,如果该版本有效,它可能会安装到其他位置,并在其中进行Debian修改,以采用Debian安装目录。最好同时使用其中一个或两个,但不要同时使用。
次佳思路
您应该安装nodejs-legacy软件包,该软件包具有从/usr /bin /node到/usr /bin /nodejs的链接
$ sudo apt-get install nodejs-legacy
第三种思路
就我而言,这是因为在我的PATH
环境变量中,我有”~/progs/node/bin/”,而”~”似乎无法由env
解析…用真正的完整路径(“/home/myuser/node/bin”)替换它可以解决我的问题。