Como eu uso uma versão local de um módulo no Windows node.js
. Por exemplo, no meu aplicativo, instalei o café-script:
npm install coffee-script
Isso o instala ./node_modules
e o comando coffee está ./node_modules/.bin/coffee
. Existe uma maneira de executar este comando quando estou na pasta principal do meu projeto? Eu acho que estou procurando algo semelhante ao bundle exec
no bundler. Basicamente, eu gostaria de especificar uma versão do script de café que todos os envolvidos no projeto devem usar.
Sei que posso adicionar o -g
sinalizador para instalá-lo globalmente, para que o café funcione bem em qualquer lugar, mas e se eu quiser ter versões diferentes de café por projeto?
node.js
coffeescript
npm
node-modules
typeoneerror
fonte
fonte
npm install niftycommand
e entãoniftycommand
. Mas isso nunca funcionará, a menos que você tenha ./node_modules/.bin no seu caminho, certo?coffee
comando nanpm scripts
seção, como"build": "coffee -co target/directory source/directoy", so you can run
npm run build` do terminal posteriormente.npx
que vem comnpm 5.2.0
medium.com/@maybekatz/…Respostas:
ATUALIZAÇÃO : Como Seyeong Jeong aponta na resposta abaixo, desde a npm 5.2.0 você pode usar
npx [command]
, o que é mais conveniente.RESPOSTA ANTIGA para versões anteriores à 5.2.0 :
O problema de colocar
no PATH é que ele só funciona quando o diretório de trabalho atual é a raiz da estrutura de diretórios do projeto (ou seja, a localização de
node_modules
)Independentemente do diretório de trabalho, você pode obter o caminho dos binários instalados localmente com
Para executar um
coffee
binário instalado localmente, independentemente de onde você está na hierarquia de diretórios do projeto, você pode usar esta construção bashEu alias isso para npm-exec
Então agora eu posso
para executar a cópia correta do café, não importa onde eu esteja
fonte
alias coffee="npm-exec coffee"
npm bin
procura na cadeia de 'diretórios ancestrais' no cwd por um diretório node_modules. Esse é exatamente o comportamento desejado se você desejar especificamente usar os binários dos módulos listados no package.json do projeto.PATH
estará de volta ao que era antes da chamada do comando. Definir uma variável de ambiente na mesma linha, antes de executar um comando, afeta apenas o ambiente desse comando.Você não precisa
$PATH
mais manipular !No [email protected] , o npm é enviado com um
npx
pacote que permite executar comandos de umnode_modules/.bin
cache local ou central.Basta executar:
Por padrão,
npx
verifica se<command>
existe$PATH
ou nos binários do projeto local e o executa.Chamando
npx <command>
quando<command>
já não está na sua$PATH
vontade instalar automaticamente um pacote com esse nome a partir do registro NPM para você, e invocá-lo. Quando terminar, o pacote instalado não estará em nenhum lugar do seu mundo, portanto você não precisará se preocupar com poluição a longo prazo. Você pode impedir esse comportamento fornecendo a--no-install
opçãoPara
npm < 5.2.0
, você pode instalar onpx
pacote manualmente executando o seguinte comando:fonte
npm
epackage.json
fornece quase a mesma funcionalidade.npx
é coxo. Deveria ter sidonpm run
ounpm exec
ou algo assim.npm run [my-local-package]
não está funcionando no meu Ubuntu, embora parecesse funcionar em um dispositivo Windows.Use o
npm bin
comando para obter o diretório modules / bin do nó do seu projetopor exemplo
fonte
export PATH="./node_modules/.bin:$PATH"
$(npm bin)/jasmine
, nãonode $(npm bin)/jasmine
(você provavelmente descobriu, mas esclarece para os outros).Usar
npm run[-script] <script name>
Depois de usar o npm para instalar o pacote bin no
./node_modules
diretório local , modifiquepackage.json
para adicionar da<script name>
seguinte maneira:Seria bom se o npm install tivesse uma opção --add-script ou algo assim ou se o npm run funcionasse sem adicionar ao bloco de scripts.
fonte
npm install
então tem acesso às suas dependências de desenvolvimento. A única desvantagem menor é que você precisanpm run eslint
(ou o que seja). Você pode criar um script chamado "start" que execute gulp, para que você só precise digitarnpm start
para iniciar seu servidor de desenvolvimento. Coisas bem legais e sem graça, então seus amigos do Windows ainda gostam de você. :)--
like:npm run learnyounode -- --normal-switches --watch -d *.js
npm run ts-node
não está funcionando para mim. Eu só vou ter que voltar ao npx.Use
npm-run
.No leia-me:
npm-run
Encontre e execute executáveis locais a partir de node_modules
Qualquer executável disponível para um script de ciclo de vida npm está disponível para
npm-run
.Uso
Instalação
fonte
Atualização: não recomendo mais esse método, pelos motivos de segurança mencionados e pelo menos pelo mais novo
npm bin
comando . Resposta original abaixo:Como você descobriu, existem binários instalados localmente
./node_modules/.bin
. Para sempre executar binários neste diretório, em vez de binários disponíveis globalmente, se houver, sugiro que você coloque o./node_modules/.bin
primeiro no seu caminho:Se você colocar isso no seu
~/.profile
,coffee
sempre estará./node_modules/.bin/coffee
disponível, caso contrário/usr/local/bin/coffee
(ou qualquer prefixo no qual você esteja instalando os módulos do nó).fonte
./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
/tmp
), qualquer processo ou usuário pode seqüestrar sua sessão, colocando versões maliciosas de comandos comuns (comols
,cp
, etc.) lá. Isso pode gerar subconchas 'invisíveis' capturando suas senhas, etc.alias npm-exec='PATH=$(npm bin):$PATH'
é mais liso.PATH
, mas a última (usando o$(npm bin)
formulário)? para que eles não possam sobrescrever o material existente, e você já estaria confiando nos executáveis nonpm bin
diretório, independentemente daPATH
var; o modelo de ameaça seria o seguinte: a) alguém mal-intencionado obtém acesso ao seu sistema de arquivos; b) adiciona executáveis com nomes próximos às ferramentas do sistema; ec) você digita incorretamente? Tentando entender cenários que tornam isso ruim, já que você já confia em executáveis estrangeiros ao usarnpm
programas instalados.A solução PATH tem o problema de que, se $ (npm bin) for colocado em seu .profile / .bashrc / etc, ele é avaliado uma vez e é definido para sempre no diretório em que o caminho foi avaliado pela primeira vez. Se, em vez disso, você modificar o caminho atual, toda vez que você executa o script, seu caminho cresce.
Para contornar esses problemas, crio uma função e a usei. Não modifica seu ambiente e é simples de usar:
Isso pode ser usado assim sem fazer alterações no seu ambiente:
fonte
n
Se você deseja manter o npm, o npx deve fazer o que você precisa.
Se mudar para o fio (uma substituição de npm pelo facebook) é uma opção para você, você pode ligar para:
scripts dentro do package.json terão precedência, se nenhum for encontrado, ele procurará dentro da
./node_modules/.bin/
pasta.Ele também exibe o que foi executado:
Portanto, você não precisa configurar scripts para cada comando no seu
package.json
.Se você tivesse um script definido
.scripts
dentro de seupackage.json
:yarn tsc
seria equivalenteyarn run tsc
ounpm run tsc
:fonte
atualização: se você estiver no npm recente (versão> 5.2)
Você pode usar:
npx
procura pelo comando no.bin
diretório do seunode_modules
resposta antiga:
Para Windows
Armazene o seguinte em um arquivo chamado
npm-exec.bat
e adicione-o ao seu%PATH%
Uso
Então você pode usá-lo como
npm-exec <command> <arg0> <arg1> ...
Por exemplo
Para executar
wdio
instalado no diretório local node_modules, faça:ou seja, ele será executado
.\node_modules\.bin\wdio wdio.conf.js
fonte
Prefiro não confiar em aliases do shell ou em outro pacote.
Adicionando uma linha simples à
scripts
seção do seupackage.json
, você pode executar comandos locais do npm comonpm run webpack
package.json
fonte
Se você deseja que sua variável PATH seja atualizada corretamente com base no seu diretório de trabalho atual, adicione-a ao final de seu
.bashrc
equivalente (ou depois de qualquer coisa que o definaPATH
):Isso pode adicionar um pequeno atraso toda vez que o prompt do bash é renderizado (dependendo do tamanho do seu projeto, provavelmente), por isso é desativado por padrão.
Você pode habilitá-lo e desabilitá-lo em seu terminal executando
node-mode
enode-mode-off
, respectivamente.fonte
Sempre usei a mesma abordagem que o @guneysus para resolver esse problema, que está criando um script no arquivo package.json e o usando executando o npm run script-name.
No entanto, nos últimos meses eu tenho usado o npx e adoro isso.
Por exemplo, baixei um projeto Angular e não queria instalar a CLI Angular globalmente. Portanto, com o npx instalado, em vez de usar o comando angular global cli (se eu o tivesse instalado) assim:
Eu posso fazer isso no console:
Aqui está um artigo que escrevi sobre o NPX e que é mais aprofundado.
fonte
O zxc é como "bundle exec" para nodejs. É semelhante ao uso
PATH=$(npm bin):$PATH
:fonte
A mesma solução aceita do @regular, mas o sabor da casca do peixe
fonte
Você também pode usar o direnv e alterar a variável $ PATH apenas na sua pasta de trabalho.
fonte
Adicione este script ao seu
.bashrc
. Então você pode ligarcoffee
ou qualquer coisa localmente. Isso é útil para o seu laptop, mas não o use no servidor.nota : este script faz um aliasse de
cd
comando e, após cada chamadacd
, verificanode_modules/.bin
e adiciona-o ao seu$PATH
.note2 : você pode alterar a terceira linha para
NODE_MODULES=$(npm bin);
. Mas isso tornaria ocd
comando muito lento.fonte
$(npm bin)
vez de codificar./node_modules/.bin
.$(npm bin)
parece muito lento para usar com cadacd
comando. Eu restaurei o código e adicionei uma nota para ele.Para Windows, use este:
fonte
Encontrei o mesmo problema e não gosto particularmente de usar aliases (como sugerido pelo regular ), e se você não gostar também, aqui está outra solução alternativa que eu uso: primeiro você deve criar um pequeno script bash executável, diga setenv.sh :
e então você pode usar qualquer executável em seu local
/bin
usando este comando:Se você estiver usando o
scripts
package.json, então:fonte
Eu adoraria saber se essa é uma idéia insegura / ruim, mas depois de pensar um pouco sobre isso, não vejo um problema aqui:
Modificando a solução insegura de Linus para adicioná-lo até o fim, usando
npm bin
para encontrar o diretório e fazendo o script chamar somentenpm bin
quando apackage.json
está presente em um pai (para velocidade), é isso que eu crieizsh
:Pois
bash
, em vez de usar oprecmd
gancho, você pode usar a$PROMPT_COMMAND
variável (não testei isso, mas você entendeu):fonte
npm bin
ao final de$PATH
pode não executar o que o usuário espera: basicamente outro executável, mas provavelmente um pacote instalado globalmente com outra versão!Eu sou um
Windows
usuário e é isso que funcionou para mim:Boa sorte.
fonte
Caso você esteja usando
fish shell
e não queira adicionar$path
por motivos de segurança. Podemos adicionar a função abaixo para executar executáveis de nó local.Agora você pode executar coisas como:
n coffee
ou mais argumentos como:
n browser-sync --version
Observe que, se você é
bash
usuário, as respostas @ Bob9630 são o caminho a seguir, aproveitando o bash's$@
, que não está disponível nofishshell
.fonte
Inclua coffee-script no package.json com a versão específica requerida em cada projeto, normalmente assim:
Em seguida, execute o npm install para instalar dependências em cada projeto. Isso instalará a versão especificada do script café, que estará acessível localmente para cada projeto.
fonte
npm install svgo
, assim comonpm install
com o package.json. Ambos os métodos foram instalados "com sucesso", mas o comando "svgo" ainda não está disponível.grunt-cli
pacote globalmente, depois no diretório do projeto, instala qualquer versão (modificada) dogrunt
pacote e, quando você executagrunt
, ele usa essa versão local.