在Openshift中通过Python设备安装Node包

时间:2016-04-30 23:03:55

标签: python node.js openshift npm-install

我在RedHat Openshift服务器上使用一个Python3.3设备设置了一个Django应用程序。对于应用程序的前端部分,我需要几个工具:lesstypescriptgoogle-closure-compiler,它们应与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编译器?

1 个答案:

答案 0 :(得分:0)

感谢之前提到的非常相似的question,我已经想出了如何做到这一点,尽管可能不是最优化的方式。对我有用的程序如下:

  1. 通过SSH连接到您的应用,并将环境变量设置为指向具有依赖关系的位置:
    export DEPENDENCY_BASE="$OPENSHIFT_HOMEDIR/app-root/dependencies"
  2. 通过从official web site下载Linux二进制文件并将其解压缩,在node.js下安装最新/所需版本的$DEPENDENCY_BASE/node
    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"
  7. 现在每次必须安装包时,都应使用以下命令:
    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变量,因为之后系统会覆盖它。