如何在 Unix 伺服器上安裝 Node.js 和 NPM,以便沒有使用者需要 sudo 來安裝或讀取全域包?
這真的是一種我無法在任何地方找到答案的罕見情況嗎?反正。我在 DigitalOcean 上有一個 Ubuntu VM 伺服器,我在該伺服器上執行 Jenkins 來建構、測試和本地部署 Web 應用程序(基本上將 Web 應用程序目錄複製到其他位置並重新啟動執行它的 systemctl 服務)。
問題是詹金斯在系統中生成的使用者(順便說一句,你不能用它登錄),不知何故弄亂了節點模組目錄。它安裝在 jenkins 主文件夾
/var/lib/jenkins/
中,執行時npm install
(儘管沒有-g
選項),而不是從應用程序中建構部署目錄和包解析無法解析安裝在 jenkins 首頁中的模組(儘管由 jenkins 執行,所以由 jenkins 使用者)。我懷疑解決方案是允許以某種方式管理節點安裝,這樣每個使用者都可以安裝和需要全域模組而無需使用
sudo
,但到目前為止,我查找的每個解決方案(nvm、n-install、各種腳本)都是對於單個使用者或 sudo。我真的不能對詹金斯(或任何其他程序生成的)使用者做任何事情。那麼在這種情況下最好的解決方案是什麼?
從沒有任何活動的情況來看,這看起來確實是非常罕見的情況。無論如何,我現在的解決方案是將 node.js 安裝包含到我的 Jenkinsfile 中的管道中並使用
sh
命令執行它。安裝腳本如下所示:#!/usr/bin/env bash command_exists () { command -v $1 >/dev/null 2>&1 } if command_exists 'node' && command_exists 'npm'; then echo 'Node installed, exiting' exit 0 else if [ -d $HOME/n ]; then echo 'n-install directory exists, path likely not configured, exiting' exit 0 fi echo 'Node not installed, installing' curl -L https://git.io/n-install | bash -s -- -y echo 'Reloading bashrc' . $HOME/.bashrc if command_exists 'node' && command_exists 'npm'; then echo 'Node installed successfully. Updating npm' npm i -g npm echo 'Node version:' node -v echo 'NPM version:' npm -v echo 'NPM prefix:' npm config get prefix exit 0 else echo 'Node installation failed!' exit 1 fi fi
當然,這並不理想,因為它實際上並沒有安裝 node.js 並使每個使用者都可以使用它,而是為每個使用者提供了私有的 npm 儲存庫,因此他們不需要 sudo 來安裝或讀取它們。因此,我必須單獨確保 systemd 服務用於執行應用程序的使用者也安裝了 node.js,我必須手動執行此操作。
如果有人有更好的解決方案,請告訴我。如果沒有更好的結果,我會將其標記為答案。