Grunt Umgebungsvariablen nicht Gesetzt, Bis Alle Tasks Geladen
Ich bin mit der npm
Module grunt env und load-grunt-config in meinem Projekt. grunt env
Griffe Umgebungsvariablen für Sie, während load-grunt-config
Griffe, gut, lädt die grunt
Konfiguration für Sie. Sie können Ihre Aufgaben auch in anderen Dateien, dann load-grunt-config
bundle erhalten Sie bis und haben grunt
laden & verbrauchen Sie für Sie. Sie können auch eine aliases.js
- Datei, mit Aufgaben, die Sie kombinieren möchten, zusammen in einem task ausgeführt werden einer nach dem anderen. Es ist ähnlich wie die grunt.registerTask Aufgabe in der ursprünglichen Gruntfile.js
. Ich habe alle meine grunt
Aufgaben in einem separaten grunt/
Ordner unter dem root-Ordner mit den wichtigsten Gruntfile
, ohne extra Unterordner, wie vorgeschlagen, durch die load-grunt-config
README-Datei.md auf Github. Hier ist meine abgespeckte Gruntfile
:
module.exports = function(grunt) {
'use strict';
require('time-grunt')(grunt);
//function & property declarations
grunt.initConfig({
pkg: grunt.file.readJSON('package.json')
});
require('load-grunt-config')(grunt, {
init: true,
loadGruntConfig: {
scope: 'devDependencies',
pattern: ['grunt-*', 'time-grunt']
}
});
};
In der Theorie, Einstellung, all diese Dateien in der richtigen Art und Weise für load-grunt-config
zu laden, sollte genau die selbe sein, nur mit einem Gruntfile.js
. Allerdings scheine ich zu haben, laufen Sie in einen kleinen Haken. Es scheint die Umgebungsvariablen gesetzt, die unter der env
Aufgabe nicht bekommen, legen Sie für die nachfolgenden grunt
Aufgaben, aber von der Zeit node
Prozesse Ihre Aufgaben, in diesem Fall ein express
server.
grunt env
Aufgabe:
module.exports = {
//environment variable values for developers
//creating/maintaining site
dev: {
options: {
add: {
NODE_ENV: 'dev',
MONGO_PORT: 27017,
SERVER_PORT: 3000
}
}
}
};
grunt-shell-spawn Aufgabe:
//shell command tasks
module.exports = {
//starts up MongoDB server/daemon
mongod: {
command: 'mongod --bind_ip konneka.org --port ' + (process.env.MONGO_PORT || 27017) + ' --dbpath C:/MongoDB/data/db --ipv6',
options: {
async: true, //makes this command asynchronous
stdout: false, //does not print to the console
stderr: true, //prints errors to the console
failOnError: true, //fails this task when it encounters errors
execOptions: {
cwd: '.'
}
}
}
};
grunt express Aufgabe:
module.exports = {
//default options
options: {
hostname: '127.0.0.1', //allow connections from localhost
port: (process.env.SERVER_PORT || 3000), //default port
},
prod: {
options: {
livereload: true, //automatically reload server when express pages change
//serverreload: true, //run forever-running server (do not close when finished)
server: path.resolve(__dirname, '../backend/page.js'), //express server file
bases: 'dist/' //watch files in app folder for changes
}
}
};
aliases.js
Datei (grunt-load-config
's eine Kombination von Aufgaben, so dass Sie laufen, eins nach dem anderen):
module.exports = {
//starts forever-running server with "production" environment
server: ['env:prod', 'shell:mongod', 'express:prod', 'express-keepalive']
};
Teil backend/env/prod.js
(environment-specific Express-Konfiguration geladen, wenn NODE_ENV
ist "prod", nach dem Vorbild der MEAN.JS):
'use strict';
module.exports = {
port: process.env.SERVER_PORT || 3001,
dbUrl: process.env.MONGOHQ_URL || process.env.MONGOLAB_URI || 'mongodb://konneka.org:' + (process.env.MONGO_PORT || 27018) + '/mean'
};
Teil backend/env/dev.js
(environment-specific Express-Konfiguration für dev
- Umgebung geladen, wenn das `NODE_ENV variable nicht gesetzt oder ist ("dev"):
module.exports = {
port: process.env.SERVER_PORT || 3000,
dbUrl: 'mongodb://konneka.org:' + (process.env.MONGO_PORT || 27017) + '/mean-dev'
};
Teil backend/page.js
(meine Express-Konfiguration Seite, auch nach dem Vorbild MEAN.JS):
'use strict';
var session = require('express-session');
var mongoStore = require('connect-mongo')(session);
var express = require('express');
var server = express();
...
//create the database object
var monServer = mongoose.connect(environ.dbUrl);
//create a client-server session, using a MongoDB collection/table to store its info
server.use(session({
resave: true,
saveUninitialized: true,
secret: environ.sessionSecret,
store: new mongoStore({
db: monServer.connections[0].db, //specify the database these sessions will be saved into
auto_reconnect: true
})
}));
...
//listen on port related to environment variable
server.listen(process.env.SERVER_PORT || 3000);
module.exports = server;
Wenn ich grunt server
ich bekommen:
$ cd /c/repos/konneka/ && grunt server
Running "env:prod" (env) task
Running "shell:mongod" (shell) task
Running "express:prod" (express) task
Running "express-server:prod" (express-server) task
Web server started on port:3000, hostname: 127.0.0.1 [pid: 3996]
Running "express-keepalive" task
Fatal error: failed to connect to [konneka.org:27018]
Execution Time (2014-08-15 18:05:31 UTC)
loading tasks 38.3s █████████████████████████████████ 79%
express-server:prod 8.7s ████████ 18%
express-keepalive 1.2s ██ 2%
Total 48.3s
Nun, ich kann nicht scheinen, um die Datenbank angeschlossen, in den ersten Platz, aber ignorieren, dass für jetzt. Beachten Sie, dass der server gestartet auf port 3000, was bedeutet, dass während der Ausführung der grunt express:prod
Aufgabe SERVER_PORT
ist auch nicht so der port festgelegt wird, zu 3000. Es gibt zahlreiche weitere Beispiele wie dieses, wo eine Umgebungsvariable nicht gesetzt ist, so ist meine app verwendet den Standard. Beachten Sie jedoch, dass session
versucht, eine Verbindung zu der Datenbank auf port 27018 (und scheitert), so MONGO_PORT
sich nicht dorthin setzen schließlich.
Hätte ich einfach versucht, die grunt server
Aufgabe, konnte ich Kreide es bis zu load-grunt-config
ausführen des tasks parallel statt nacheinander oder einige andere Fehler, aber selbst wenn ich versuche die Aufgaben, one-by-one, wie laufen grunt env:prod shell:mongod express-server:prod express-keepalive
bekomme ich ähnliche (falsche) Ergebnisse, also entweder grunt
oder grunt env
führen Sie die Aufgaben parallel, wie gut, oder etwas anderes Los ist.
Was ist denn hier Los? Warum sind die Umgebungsvariablen nicht richtig gesetzt für später grunt
Aufgaben? Wann sind Sie schließlich, und warum dann statt einer anderen Zeit? Wie kann ich machen, Sie zu erhalten, legen Sie für grunt
Aufgaben selbst eher als nach, vorausgesetzt, es gibt sogar einen Weg?
- Ich arbeite bis eine vollständige Testfall für diese, aber mein Erster Gedanke ist, dass
grunt env
ist nur das setzen der Umgebungsvariablen einmal Grunzen ausgeführt hat, die alle seine Aufgaben. Mögliche Lösung verbinden Sie das env-Aufgabe zu den anderen Aufgaben. - Ich versuche zu kombinieren, die Aufgaben. Das ist, warum ich bin mit
load-grunt-config
undgrunt
's eigene Methoden wieregisterTask
. Aber ich weiß was du meinst, und ich nehme an, ich werde versuchen das später. - Könnten wir die Ausgabe von
tree
(oder einige Einsicht in das, was Dateien und Ordner sind in dem Bild)? - Ich bin auf Windows mit mSysGit. Gibt es eine andere Möglichkeit? Ich legte die
grunt
Aufgaben in eine separategrunt/
Ordner, wie vorgeschlagen, durchload-grunt-config
. Keine Unterordner, nur diegrunt/
Ordner. - Ich habe gerade es auf die Frage. Ich entschuldige mich, nehme ich an, ich nahm an, es war nicht wichtig, die Frage oder "macht doch jeder so". Werde ich jemals lernen? Ich dachte auch, es wäre zu viel zu der Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung ist ziemlich offensichtlich, sobald Sie es herausfinden, so beginnen wir am Anfang:
Das problem
Bist du mit
load-grunt-config
zu laden eine Reihe von Modulen (Objekten, Aufgaben definieren) und kombinieren Sie Sie in einem Modul (Objekt) und geben Sie an, zu Grunzen. Um besser zu verstehen, wasload-grunt-config
tut, einen moment Zeit nehmen, um Lesen Sie die Quelle (es sind nur drei Dateien). Also, statt zu schreiben:Können Sie dies schreiben:
Grundsätzlich, so können Sie split eine Grunt-Konfiguration in mehrere Dateien und es werden mehr "wartbar". Aber das, was Sie brauchen, um zu realisieren, dass sich diese beiden Ansätze sind semantisch äquivalent. Das heißt, Sie können erwarten, dass Sie auf die gleiche Weise Verhalten.
Damit, wenn Sie schreiben, die folgenden*:
(* Hab ich das reduziert das problem in einem Versuch zu machen, diese Antwort ein bisschen mehr Allgemeinen und um den Lärm zu reduzieren. Ich habe ausgeschlossen, Dinge wie das laden der Aufgaben-und Fremd-option übergeben, aber die Fehler sollten noch die gleichen sein werden. Beachten Sie auch, dass habe ich geändert, die Werte der environment-Variablen, weil der Standard war das gleiche wie das, was wurde eingestellt.)
Können Sie prüfen, die oben das gleiche wie unten:
Nun sehen Sie das problem? Welchen Befehl erwarten Sie
shell:mongod
zu laufen? Die richtige Antwort ist:Dem, was Sie ausgeführt werden soll ist:
Das problem ist, dass wenn
(process.env.MONGO_PORT || 27017)
ausgewertet wird, die Umgebungsvariablen noch nicht gesetzt wurde (d.h. vor derenv:dev
Aufgabe ausgeführt wurde).Lösung
Naja schauen wir ein Grunt-Konfiguration vor der Aufteilung auf mehrere Dateien:
Nun, wenn Sie Sie ausführen
shell:mongod
ist, wird der Befehl enthalten${MONGO_PORT:-27017}
- und Bash (oder nur sh) sucht für die Umgebungsvariable würden Sie haben die Aufgabe, vor der es (d.h.env:dev
).Okay, das ist alles schön und gut für die
shell:mongod
Aufgabe, aber was ist mit den anderen Aufgaben, Express zum Beispiel?Müssen Sie Sie verschieben Weg von Umgebungsvariablen (es sei denn, Sie wollen, stellen Sie vor aufrufen Grunzen. Warum? Nehmen Sie diese Grunt-Konfiguration für Beispiel:
Welchen port wird die
express:prod
task-Konfiguration enthalten?3000
. Was Sie brauchen, ist für Sie zu Referenz der Wert, den Sie definiert haben, in der oben genannten Aufgabe. Wie Sie dies tun ist Ihnen überlassen. Sie könnten:Trennen Sie die
env
Konfiguration und Referenz Ihre WerteAber Sie werden feststellen, dass die Semantik der
env
Aufgabe nicht halten hier, da Sie nicht mehr repräsentieren eine task-Konfiguration. Sie könnten ein Objekt verwenden, von Ihrem eigenen design:Pass
grunt
ein argument angeben, welche config verwendet werden sollen,Gruntfile.js.dev
undGruntfile.js.prod
) und benennen Sie Sie als notwendiggrunt.file.readJSON('config.development.json')
), sofern vorhanden, und fallen zurück auf eine Produktion Konfigurations-Datei wenn Sie nicht existiertAber alle der oben genannten sollten zum selben Ergebnis führen.
Gruntfile
zuerst, es würde gespeichert haben Monaten Probleme. D ' Oh! Ich glaube, ich kann gehen mit Ihrem "Konfigurations-Datei" - Ansatz. Es ist ziemlich viel, was mache ich schon, mit dergrunt/env.js
Datei, aber jetzt werde ich mehr als eine.grunt
wertet Variablen vor-tasks ausgeführt werden? Das scheint ziemlich dumm, wenn man bedenkt, wie viele Male Sie können sich denken, wo würden Sie wollengrunt
zum auswerten von Variablen während eine Aufgabe, wie diese Frage.grunt env
Aufgabe ist nützlich, wenn das, was Sie wollen, Umgebungsvariablen zu verwenden.grunt shell
Vorschlag funktioniert nicht auf mSysGit ingrunt
. Es funktioniert außerhalb vongrunt
, sogrunt
muss versuchen, eine neue Umgebung oder etwas außerhalb vonsh.exe
.Dies scheint die Essenz dessen, was Sie versuchen zu tun, und es funktioniert für mich. Der wichtige Teil war, was ich bereits in meinem Kommentar -- Verkettung der Umwelt Aufgabe vor der Ausführung der anderen Aufgaben.
Gruntfile.js
Ausgabe von
grunt prod
load-grunt-config
für die Umgebung einstellen, aber statt der regulärengrunt.registerTask
?load-grunt-config
tut. Sie sind nicht mehr "verbinden" oder "Verkettung" derenv
Aufgabe mit den anderen Aufgaben war als ich.process.env.*
ist inside die Aufgabe.