Como obteria o caminho para o script no Node.js?
Eu sei que há process.cwd
, mas isso se refere apenas ao diretório em que o script foi chamado, não ao próprio script. Por exemplo, diga que eu estou /home/kyle/
e corro o seguinte comando:
node /home/kyle/some/dir/file.js
Se eu ligar process.cwd()
, eu entendo /home/kyle/
, não /home/kyle/some/dir/
. Existe uma maneira de obter esse diretório?
Respostas:
Encontrei depois de examinar a documentação novamente. O que eu estava procurando eram o
__filename
e__dirname
variáveis de nível de módulo.__filename
é o nome do arquivo do módulo atual. Este é o caminho absoluto resolvido do arquivo de módulo atual. (ex:/home/kyle/some/dir/file.js
)__dirname
é o nome do diretório do módulo atual. (ex:/home/kyle/some/dir
)fonte
__dirname.split(path.sep).pop()
require('path').basename(__dirname);
Então, basicamente, você pode fazer isso:
Use resolve () em vez de concatenar com '/' ou '\', caso contrário, você terá problemas entre plataformas.
Nota: __dirname é o caminho local do módulo ou script incluído. Se você está escrevendo um plugin que precisa conhecer o caminho do script principal, é:
ou, para obter apenas o nome da pasta:
fonte
var settings = require('./settings.json')
. Obviamente, é IO síncrona do fs, portanto, não faça isso em tempo de execução, mas no momento da inicialização está bom e, uma vez carregado, será armazenado em cache.Este comando retorna o diretório atual:
Por exemplo, para usar o caminho para ler o arquivo:
fonte
cd /foo; node bar/test.js
, o diretório atual seria/foo
, mas o script está localizado em/foo/bar/test.js
.text.txt
e ele iria trabalhar, você não precisa para construir o caminho absolutoUse __dirname !!
O nome do diretório do módulo atual. É o mesmo que o path.dirname () do
__filename
.Exemplo: executando o nó example.js de / Users / mjr
https://nodejs.org/api/modules.html#modules_dirname
Para ESModules, você desejaria usar:
import.meta.url
fonte
Quando se trata do script principal, é tão simples quanto:
A partir da documentação Node.js :
Se você precisar conhecer o caminho de um arquivo de módulo, use __filename .
fonte
process.argv[1]
se aplique apenas ao script principal enquanto__filename
aponta para o arquivo do módulo que está sendo executado. Eu atualizo minha resposta para enfatizar a diferença. Ainda assim, não vejo nada de errado em usarprocess.argv[1]
. Depende dos requisitos.O Node.js 10 suporta módulos ECMAScript , onde
__dirname
e__filename
não estão mais disponíveis .Então, para obter o caminho para o módulo ES atual, é necessário usar:
E para o diretório que contém o módulo atual:
fonte
--experimental-modules
sinalizador.fonte
__dirname
não funciona mais com módulos ES .Todo programa Node.js. possui algumas variáveis globais em seu ambiente, o que representa algumas informações sobre o seu processo e uma delas
__dirname
.fonte
__dirname
não funciona mais com os módulos ES .Sei que isso é bastante antigo, e a pergunta original à qual eu estava respondendo está marcada como duplicada e direcionada aqui, mas encontrei um problema ao tentar fazer com que os repórteres de jasmim funcionassem e não gostei da ideia de ter que fazer o downgrade ordem para que ele funcione. Descobri que o jasmine-repórteres não estava resolvendo o savePath corretamente e, na verdade, estava colocando a saída da pasta de relatórios no diretório jasmine-repórteres, em vez do diretório raiz do local onde executei o gulp. Para fazer isso funcionar corretamente, acabei usando process.env.INIT_CWD para obter o Diretório de trabalho atual inicial, que deve ser o diretório em que você executou o gulp. Espero que isso ajude alguém.
fonte
Você pode usar process.env.PWD para obter o caminho atual da pasta do aplicativo.
fonte
Se você estiver usando
pkg
para empacotar seu aplicativo, achará útil esta expressão:process.pkg
informa se o aplicativo foi compactado porpkg
.process.execPath
mantém o caminho completo do executável, que é/usr/bin/node
ou semelhante para invocações diretas de scripts (node test.js
) ou do aplicativo empacotado.require.main.filename
mantém o caminho completo do script principal, mas fica vazio quando o Node é executado no modo interativo.__dirname
contém o caminho completo do script atual , então não o estou usando (embora possa ser o que o OP pede; então é melhor usarappDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));
observando que no modo interativo__dirname
está vazio.Para o modo interativo, use
process.argv[0]
para obter o caminho para o executável do Nó ouprocess.cwd()
para obter o diretório atual.fonte
Use o
basename
método dopath
módulo:Aqui está a documentação da qual o exemplo acima foi retirado.
Como Dan apontou, o Node está trabalhando nos módulos ECMAScript com o sinalizador "--experimental-modules". O nó 12 ainda suporta
__dirname
e__filename
como acima.Se você estiver usando a
--experimental-modules
bandeira, existe uma abordagem alternativa .A alternativa é obter o caminho para o módulo ES atual :
E para o diretório que contém o módulo atual:
fonte
Se você quiser algo mais como $ 0 em um script de shell, tente o seguinte:
fonte
__dirname
e não__filename
estão mais disponíveis com os módulos ES .