node/nvm/npm 安装:sudo 与用户安装会导致麻烦吗?

node/nvm/npm 安装:sudo 与用户安装会导致麻烦吗?

问题似乎是与安装的 、 和 以及在 Ubuntu 22.0.4 系统上调用的特定 -installed 包不一致rootuser应该node (v.19.7.0)nvm (0.39.3)、和npm (v. 9.5.0)全部npm卸载并重新安装为,还是逐个进行 - 或者如果一切都保持原样,它会起作用吗?也许我应该注意,这只是为了让一个脚本在用户级别运行计算,即不用于网站处理大量网络流量等。svg-path-interpolatornodenvmnpmuser

背景:我曾天真地尝试让 JavaScript 代码运行描述在这里。特定包名为svg-path-interpolator。该项目存在许多问题,这导致我仔细检查了nodenvm和的安装 - 尽管使用一些简单的 java 脚本(例如来自教程或节点网站)进行简单检查可以正常工作。我认为 的版本被证明是“正确”的,例如 ,npm这是件好事。node19.7.0

看来我安装npmnvm和 的方法node(至少)也很幼稚。我使用的命令(我认为)顺序如下:

sudo apt install npm

sudo npm install -g svg-path-interpolator

sudo npm install svg-path-interpolator --save

npm install svg-path-interpolator(在某一点)

sudo apt install node(大概)

请注意,npm首先在本地运行,没有特殊权限。我想要运行的脚本不起作用,所以我自然而然npm地“全局”运行,并且自然而然,脚本不起作用。帮助页面说In global mode (ie, with -g or --global appended to the command), it installs the current package context (ie, the current working directory) as a global package.- 我在其他地方读过这个想法 - 这是什么意思,CWD 正在以某种方式被使用?

我也尝试了这个--save选项。通过进一步阅读(尤其是关于权限和工作目录),我发现这种随意的用户与管理员安装方式很糟糕。我的系统上的一些证据如下(摘录):

ls -ltraF /home/user/package-lock.json
-rw-r--r-- 1 root root 2091 Mar  5 11:46 /home/user/package-lock.json
ls -ltraF ~/node_modules/.package-lock.json 
-rw-r--r-- 1 root root 1117 Mar  5 11:46 /home/user/node_modules/.package-lock.json

我还发现svg-path-interpolator缺少以下内容:

/home/user/.nvm/versions/node/v19.7.0/lib/node_modules/npm/node_modules/

还有,node_modules因此/usr/local/lib很容易令人困惑。

最后一条线索:在尝试使原始任务正常工作时,另一个错误令人担忧(但这可能无关紧要):

./svgpi.mjs config.json  balloons.svg  output.json
[Error: ENOENT: no such file or directory, mkdir ''] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'mkdir',
  path: ''
}

为了解决这个问题,我可能已经运行过一次脚本sudo来查看会发生什么,但是它似乎没有做任何事情(我希望)。

因此,也许我不必进行可怕的完全卸载并重新安装,但只能以用户身份进行,而是可以保持原样,只需按照手册页/网页或 Stack Exchange 帖子中的指导将其删除并以某种方式package-lock.json写出来- 我一直在仔细遵循这些指导。我试图涵盖基础知识,但我再次写了一篇很长的帖子,因为具体要问或要做的事情不清楚 - 抱歉。usernpmnvm

答案1

这似乎让事情有了进展:

重点是运行由安装的一个小脚本npm(如上面的链接所述)。顺便说一句,必须运行dos2unix该脚本。手动执行export PATH=$PATH:/home/user/node_modules/my-favorite-module-package/bin/。相关技术细节:.mjs文件有await fs.mkdir(dir, {recursive: true});。这产生了一个ENOENT error -2当脚本按指示运行时 -mkdir输出文件。因为中的那个构造中有一个.mjs。我省略输出文件,过程完成(显然,正确完成)。省略输出文件并不明显。我在这个答案中写的所有(...大部分)内容都是通过使用搜索引擎找到的,并且通常选择通常/优先在 Stack Overflow 或 Stack Exchange 上的热门内容 - 即所有内容都在这里。

我将保留nvmnodenpm和其他任何东西(例如javacurl很久以前安装的东西) - 随着时间的推移,也许会对 root 拥有的package东西做些什么。不知道为什么PATH在经历了这一切之后没有自动设置,但没关系。

严格来说,这不是答案,而是一种解决方法 - 人们可以阅读 Meta SE 以了解 Stack Exchange 上如何处理解决方法与答案。剧透:解决方法可以是答案。

相关内容