在 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 应用程序安装这些包,以便 lessc
和 tsc
编译器可以在构建过程中在服务器上执行?
多亏了之前被问到的非常相似的 question,我已经想出了如何做到这一点,尽管可能不是最佳方式。对我有用的程序如下:
- 通过 SSH 连接到您的应用程序并设置环境变量指向具有依赖项的位置:
export DEPENDENCY_BASE="$OPENSHIFT_HOMEDIR/app-root/dependencies"
- 通过从 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
- 为本地安装的
npm
管理器创建以下 2 个文件夹:
mkdir -p $DEPENDENCY_BASE/.npm $DEPENDENCY_BASE/node_modules/.bin
- 将本地安装的包和
node.js
添加到 PATH
以便它们优先于全局包:
export PATH="$DEPENDENCY_BASE/node_modules/.bin/:$DEPENDENCY_BASE/node/bin/:$PATH"
- 执行
node --version; npm --version
以确保现在使用新版本
- 将
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
变量的任何工作方法,因为它随后会被系统覆盖。
我已经在 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 应用程序安装这些包,以便 lessc
和 tsc
编译器可以在构建过程中在服务器上执行?
多亏了之前被问到的非常相似的 question,我已经想出了如何做到这一点,尽管可能不是最佳方式。对我有用的程序如下:
- 通过 SSH 连接到您的应用程序并设置环境变量指向具有依赖项的位置:
export DEPENDENCY_BASE="$OPENSHIFT_HOMEDIR/app-root/dependencies"
- 通过从 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
- 为本地安装的
npm
管理器创建以下 2 个文件夹:
mkdir -p $DEPENDENCY_BASE/.npm $DEPENDENCY_BASE/node_modules/.bin
- 将本地安装的包和
node.js
添加到PATH
以便它们优先于全局包:
export PATH="$DEPENDENCY_BASE/node_modules/.bin/:$DEPENDENCY_BASE/node/bin/:$PATH"
- 执行
node --version; npm --version
以确保现在使用新版本 - 将
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
变量的任何工作方法,因为它随后会被系统覆盖。