2016-04-30 10 views
0

Ich habe eine Django-Anwendung auf dem RedHat Openshift Server mit einem einzigen Python3.3 Getriebe eingerichtet. Für den Frontend-Teil der Anwendung benötige ich mehrere Werkzeuge: less, typescript, google-closure-compiler, die mit dem npm install <package> Befehl installiert werden sollten.Installieren Sie Node-Pakete über Python-Getriebe in Openshift

Leider ist es nicht möglich zu sein scheint, da die Ausführung dieses Befehls in der Openshift SSH-Konsole einen Berechtigungsfehler ergibt: kann ich

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. 

Zum Glück der google-closure-compiler nur durch den Download des kompilierten Java-Skripts installieren, Für andere ist keine alternative Installationsmethode dokumentiert.

Ist es möglich, diese Pakete für eine Python-App irgendwie in Openshift zu installieren, so dass die Compiler lessc und tsc während des Buildprozesses auf dem Server ausgeführt werden können?

Antwort

0

Dank einer sehr ähnlichen question, die zuvor gefragt wurde, habe ich herausgefunden, wie dies zu tun ist, obwohl möglicherweise nicht auf die optimale Weise. Das Verfahren, das für mich gearbeitet ist folgende:

  1. Verbindung zu Ihrem App via SSH und der Umgebungsvariable zeigt auf die Stelle mit Abhängigkeiten:
    export DEPENDENCY_BASE="$OPENSHIFT_HOMEDIR/app-root/dependencies"
  2. Installieren Sie die neueste/gewünschte Version von node.js unter $DEPENDENCY_BASE/node durch den Linux-binär aus dem official web site Herunterladen und Extrahieren es:
    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. erstellen sie die folgenden zwei Ordner für den lokal installierten npm Manager:
    mkdir -p $DEPENDENCY_BASE/.npm $DEPENDENCY_BASE/node_modules/.bin
  4. Fügen Sie die lokal installierten Pakete und node.js zum PATH, so dass sie Vorrang vor den globalen Dateien:
    export PATH="$DEPENDENCY_BASE/node_modules/.bin/:$DEPENDENCY_BASE/node/bin/:$PATH"
  5. node --version; npm --version ausführen, um sicherzustellen, dass die neuen Versionen verwendet werden nun
  6. den Cache-Ordner Set für npm der in Schritt 3 erstellt haben, für die wir Schreibrechte:
    npm config set cache "$DEPENDENCY_BASE/.npm"

Nun jedes Mal, wenn ein Paket installiert werden muss, soll der folgende Befehl verwendet werden:
npm install --prefix $DEPENDENCY_BASE <package name> [1]

Es Pakete im $DEPENDENCY_BASE/node_modules/ Ordner installieren, während die entsprechenden Binärdateien werden im $DEPENDENCY_BASE/node_modules/.bin/ Ordner verknüpft werden.


Offenbar kann das gleiche Ergebnis ohne Installation eine neue Version von node.js lokal erreicht werden, aber die installierte npm Version ist eher dort alt, die bestimmten Funktionen fehlen dürfte.


Sie setzten natürlich Befehle 1 und 4 in den $OPENSHIFT_HOMEDIR/app-root/repo/.openshift/action_hooks/pre_build, um den Befehl zu verwenden [1] für die automatische Bereitstellung. Noch besser, anstelle des Befehls 1, setzen Sie die globale Umgebungsvariable wie in der Openshift documentation beschrieben.

Wenn Sie diese Befehle interaktiv verwenden möchten, wenn sie über SSH verbunden sind, dann scheint es am besten, sie in ein Bash-Skript zu schreiben und manuell auszuführen. Ich konnte keinen funktionierenden Weg finden, die $PATH Variable bei der Anmeldung voranzustellen, da sie danach vom System überschrieben wird.