Existe uma maneira melhor que process.cwd()
de determinar o diretório raiz de um processo do nodo.js em execução? Algo como o equivalente ao Rails.root
, mas para o Node.js. I'm procurando por algo que seja tão previsível e confiável quanto possível.
Há várias formas de abordar esta questão, cada uma com os seus próprios prós e contras:
Do http://nodejs.org/api/modules.html:
Quando um arquivo é executado diretamente do Nó,
require.main
é definido para o seumódulo
. Isso significa que você pode determinar se um arquivo foi executado diretamente testandorequire.main ==== módulo
.Como o
módulo
fornece uma propriedadenome do ficheiro
(normalmente equivalente a__nome do ficheiro
), o ponto de entrada da aplicação actual pode ser obtido verificandorequire.main.filename
.
Portanto, se você quiser o diretório base para o seu aplicativo, você pode fazer:
var path = require('path');
var appDir = path.dirname(require.main.filename);
Isto funcionará muito bem na maioria das vezes, mas se você'estiver executando sua aplicação com um lançador como **pm2* ou executando mocha** testes, este método irá falhar.
O nó tem um objeto global chamado global' - qualquer coisa que você anexe a este objeto estará disponível em qualquer lugar da sua aplicação. Então, no seu
index.js(ou
app.js` ou qualquer que seja o nome do seu arquivo principal da aplicação), você pode apenas definir uma variável global:
// index.js
var path = require('path');
global.appRoot = path.resolve(__dirname);
// lib/moduleA/component1.js
require(appRoot + '/lib/moduleB/component2.js');
Funciona consistentemente, mas você tem que confiar em uma variável global, o que significa que você pode't facilmente reutilizar componentes/etc.
Isto retorna o diretório de trabalho atual. Não é nada confiável, pois depende inteiramente de qual diretório o processo foi lançado **de***:
$ cd /home/demo/
$ mkdir subdir
$ echo "console.log(process.cwd());" > subdir/demo.js
$ node subdir/demo.js
/home/demo
$ cd subdir
$ node demo.js
/home/demo/subdir
Para resolver este problema, I'criei um módulo de nó chamado app-root-path. O uso é simples:
var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');
O módulo app-root-path utiliza várias técnicas diferentes para determinar o caminho raiz da aplicação, levando em conta módulos instalados globalmente (por exemplo, se a sua aplicação está rodando em /var/wwww/
mas o módulo está instalado em ~/.nvm/v0.x.x/lib/node/
). Ele ganhou't funciona 100% do tempo, mas ele's vai funcionar na maioria dos cenários comuns.
Funciona sem configuração na maioria das circunstâncias. Também fornece alguns bons métodos adicionais de conveniência (ver página do projeto). O maior golpe é que ele ganhou't funciona se:
node_modules
(por exemplo, se você o instalou globalmente)Você pode contornar isso definindo uma variável ambiental APP_ROOT_PATH', ou chamando
.setPath()no módulo, mas nesse caso, você'provavelmente está melhor utilizando o método
global'.
Se você'está procurando uma forma de determinar o caminho raiz do aplicativo atual, uma das soluções acima provavelmente funcionará melhor para você. Se, por outro lado, você're estiver tentando resolver o problema de carregar os módulos da aplicação de forma confiável, eu recomendo que você verifique a variável ambiental NODE_PATH
.
Node's Modules system procura por módulos em uma variedade de locais. Um desses locais é onde quer que o process.env.NODE_PATH
aponte. Se você definir esta variável ambiental, então você pode requerir
módulos com o carregador de módulos padrão sem nenhuma outra alteração.
Por exemplo, se você definir NODE_PATH
para /var/wwww/lib
, o seguinte funcionaria muito bem:
require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js
Uma ótima maneira de fazer isso é utilizando o npm
:
"scripts": {
"start": "NODE_PATH=. node app.js"
}
Agora você pode iniciar seu aplicativo com npm start
e você're golden. Eu combino isso com o meu módulo enforce-node-path, que evita carregar acidentalmente o aplicativo sem o NODE_PATH
definido. Para ainda mais controle sobre a execução de variáveis ambientais, veja checkenv.
Um tem: NODE_PATH
must ser definido **outide*** do aplicativo do nó. Você não pode fazer algo como process.env.NODE_PATH = path.resolve(__dirname)
porque o carregador de módulos armazena em cache a lista de diretórios que ele irá pesquisar antes da sua aplicação ser executada.
[adicionado 4/6/16] Outro módulo realmente promissor que tenta resolver este problema é wavy.
O __nome
é't um global; ele's local para o módulo atual, assim cada arquivo tem seu próprio valor local, diferente.
Se você quer o diretório raiz do processo em execução, você provavelmente quer utilizar o process.cwd()
.
Se você quer previsibilidade e confiabilidade, então você provavelmente precisa fazer da sua aplicação um requisito que uma determinada variável de ambiente seja definida. Sua aplicação procura por MY_APP_HOME
(Ou o que quer que seja) e se ela's está lá, e a aplicação existe nesse diretório então tudo está bem. Se não estiver definida ou se o diretório não't contém a sua aplicação então ela deve sair com um erro solicitando ao usuário que crie a variável. Ela pode ser definida como parte de um processo de instalação.
Você pode ler variáveis de ambiente no nó com algo como process.env.MY_ENV_VARIABLE
.
1- criar um arquivo na raiz do projeto chame-o **settings.js***
2- dentro deste arquivo adicione este código
module.exports = {
POST_MAX_SIZE : 40 , //MB
UPLOAD_MAX_FILE_SIZE: 40, //MB
PROJECT_DIR : __dirname
};
3- dentro dos módulos_node crie um novo nome de módulo it "settings" e dentro do módulo index.js escreva este código:
module.exports = require("../../settings");
4- e sempre que você quiser que seu diretório de projetos apenas use
var settings = require("settings");
settings.PROJECT_DIR;
Desta forma terá todos os directórios de projectos relativos a este ficheiro ;)