在 Openshift 的 Python 齿轮上安装 Node 包

Install Node packages over Python gear in Openshift

我已经在 RedHat Openshift server with a single Python3.3 gear. For the front-end part of the application I need several tools: less, typescript, google-closure-compiler 上设置了一个 Django 应用程序,它应该使用 npm install <package> 命令安装。

不幸的是,这似乎不可能,因为在 Openshift SSH 控制台中执行此命令会产生权限错误:

npm ERR! Error: EACCES, mkdir '/var/lib/openshift/572240982d5271a20c0000e2/.npm'
npm ERR!  { [Error: EACCES, mkdir '/var/lib/openshift/572240982d5271a20c0000e2/.npm']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/var/lib/openshift/572240982d5271a20c0000e2/.npm' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

幸运的是,我可以通过下载已编译的 Java 脚本来安装 google-closure-compiler,但对于其他人,没有记录替代安装方法。

是否有可能以某种方式在 Openshift 中为 Python 应用程序安装这些包,以便 lessctsc 编译器可以在构建过程中在服务器上执行?

多亏了之前被问到的非常相似的 question,我已经想出了如何做到这一点,尽管可能不是最佳方式。对我有用的程序如下:

  1. 通过 SSH 连接到您的应用程序并设置环境变量指向具有依赖项的位置:
    export DEPENDENCY_BASE="$OPENSHIFT_HOMEDIR/app-root/dependencies"
  2. 通过从 official web site 下载 Linux 二进制文件并解压,在 $DEPENDENCY_BASE/node 下安装 node.js 的 latest/desired 版本:
    cd $DEPENDENCY_BASE; wget https://nodejs.org/dist/v4.4.3/node-v4.4.3-linux-x64.tar.xz; tar -xf node-v4.4.3-linux-x64.tar.xz; mv node-v4.4.3-linux-x64 node; rm node-v4.4.3-linux-x64.tar.xz
  3. 为本地安装的 npm 管理器创建以下 2 个文件夹:
    mkdir -p $DEPENDENCY_BASE/.npm $DEPENDENCY_BASE/node_modules/.bin
  4. 将本地安装的包和 node.js 添加到 PATH 以便它们优先于全局包:
    export PATH="$DEPENDENCY_BASE/node_modules/.bin/:$DEPENDENCY_BASE/node/bin/:$PATH"
  5. 执行node --version; npm --version以确保现在使用新版本
  6. npm 的缓存文件夹设置为在第 3 步中创建的文件夹,我们对其具有写入权限:
    npm config set cache "$DEPENDENCY_BASE/.npm"

现在每次安装包时,都应该使用以下命令:
npm install --prefix $DEPENDENCY_BASE <package name>[1]

它将在 $DEPENDENCY_BASE/node_modules/ 文件夹中安装软件包,而相应的二进制文件将链接到 $DEPENDENCY_BASE/node_modules/.bin/ 文件夹中。


显然,无需在本地安装新版本的 node.js 也可以达到相同的结果,但是安装的 npm 版本相当旧,可能缺少某些功能。


您当然可以将命令1和4放在$OPENSHIFT_HOMEDIR/app-root/repo/.openshift/action_hooks/pre_build中,以便使用命令[1]进行自动部署。更好的是,代替命令 1,设置全局环境变量,如 Openshift documentation.

中所述

如果你想在通过 SSH 连接时交互地使用这些命令,不幸的是,最好的方法似乎是将它们放在 bash 脚本中,然后 运行 手动执行。我找不到在登录时添加 $PATH 变量的任何工作方法,因为它随后会被系统覆盖。