2016-04-30 2 views
0

Я установил приложение Django на сервере RedHat Openshift с одной передачей Python3.3. Для передней части приложения мне нужно несколько инструментов: less, typescript, google-closure-compiler, которые должны быть установлены с помощью команды npm install <package>.Устанавливать пакеты узлов через механизм Python в Openshift

К сожалению, это не представляется возможным, так как выполнение этой команды в консоли 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. 

К счастью, я могу установить google-closure-compiler, просто загрузив скомпилированный Java скрипт, но для других нет альтернативного метода установки.

Возможно ли каким-либо образом установить эти пакеты для приложения Python в Openshift, чтобы на этапе сборки могли выполняться компиляторы и tsc?

ответ

0

Благодаря очень похожему question, который был задан раньше, я выяснил, как это сделать, хотя потенциально не самым оптимальным способом. Процедура, которая работала для меня заключается в следующем:

  1. Подключение к вашему приложению через SSH и установить переменную окружения, указывающие на местоположение с зависимостями:
    export DEPENDENCY_BASE="$OPENSHIFT_HOMEDIR/app-root/dependencies"
  2. Установите последнюю/нужную версию node.js под $DEPENDENCY_BASE/node путем загрузки бинарного Linux из official web site и извлечений его:
    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. Создайте следующие 2 папок для локально установленной npm менеджера:
    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 при входе в систему, поскольку после этого она будет перезаписана системой.