Linux

如何在 Unix 伺服器上安裝 Node.js 和 NPM,以便沒有使用者需要 sudo 來安裝或讀取全域包?

  • July 13, 2017

這真的是一種我無法在任何地方找到答案的罕見情況嗎?反正。我在 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,我必須手動執行此操作。

如果有人有更好的解決方案,請告訴我。如果沒有更好的結果,我會將其標記為答案。

引用自:https://serverfault.com/questions/861782