node.js - node_modules - npm install windows
¿Cómo usar el paquete instalado localmente en node_modules? (22)
¿Cómo uso una versión local de un módulo en node.js
? Por ejemplo, en mi aplicación, instalé coffee-script:
npm install coffee-script
Esto lo instala en ./node_modules
y el comando coffee está en ./node_modules/.bin/coffee
. ¿Hay alguna forma de ejecutar este comando cuando estoy en la carpeta principal de mi proyecto? Supongo que estoy buscando algo similar a bundle exec
en bundler. Básicamente, me gustaría especificar una versión de coffee-script que todos los involucrados en el proyecto deberían usar.
Sé que puedo agregar la -g
para instalarlo globalmente, de modo que el café funcione bien en cualquier lugar, pero ¿y si quisiera tener diferentes versiones de café por proyecto?
Para ventanas
Almacene lo siguiente en un archivo llamado npm-exec.bat
y agréguelo a su %PATH%
@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN ('' %cmd% '') DO SET modules=%%i
"%modules%"/%*
Uso
Luego puedes usarlo como npm-exec <command> <arg0> <arg1> ...
Por ejemplo
Para ejecutar wdio
instalado en el directorio local de node_modules, haga:
npm-exec wdio wdio.conf.js
es decir, ejecutará ./node_modules/.bin/wdio wdio.conf.js
Agrega este script a tu .bashrc
. Entonces puedes llamar coffee
o cualquier cosa localmente. Esto es útil para su computadora portátil, pero no la use en su servidor.
DEFAULT_PATH=$PATH;
add_local_node_modules_to_path(){
NODE_MODULES=''./node_modules/.bin'';
if [ -d $NODE_MODULES ]; then
PATH=$DEFAULT_PATH:$NODE_MODULES;
else
PATH=$DEFAULT_PATH;
fi
}
cd () {
builtin cd "$@";
add_local_node_modules_to_path;
}
add_local_node_modules_to_path;
nota : este script hace un alias del comando cd
, y después de cada llamada de cd
comprueba node_modules/.bin
y lo agrega a su $PATH
.
nota2 : puede cambiar la tercera línea a NODE_MODULES=$(npm bin);
. Pero eso haría que el comando cd
demasiado lento.
En caso de que esté utilizando fish shell
y no desee agregar a $path
por razones de seguridad. Podemos agregar la siguiente función para ejecutar ejecutables de nodo local.
### run executables in node_module/.bin directory
function n
set -l npmbin (npm bin)
set -l argvCount (count $argv)
switch $argvCount
case 0
echo please specify the local node executable as 1st argument
case 1
# for one argument, we can eval directly
eval $npmbin/$argv
case ''*''
set --local executable $argv[1]
# for 2 or more arguments we cannot append directly after the $npmbin/ since the fish will apply each array element after the the start string: $npmbin/arg1 $npmbin/arg2...
# This is just how fish interoperate array.
set --erase argv[1]
eval $npmbin/$executable $argv
end
end
Ahora puedes correr cosa como:
n coffee
o más argumentos como:
n browser-sync --version
Tenga en cuenta que si es usuario de bash
, entonces @ Bob9630 responde que es la mejor manera de aprovechar el $@
bash, que no está disponible en fishshell
.
Incluya coffee-script en package.json con la versión específica requerida en cada proyecto, típicamente así:
"dependencies":{
"coffee-script": ">= 1.2.0"
Luego ejecute npm install para instalar dependencias en cada proyecto. Esto instalará la versión especificada de coffee-script que será accesible localmente para cada proyecto.
La misma solución aceptada de @regular, pero con sabor a cáscara de pescado.
if not contains (npm bin) $PATH
set PATH (npm bin) $PATH
end
La solución PATH tiene el problema de que si se coloca $ (npm bin) en su .profile / .bashrc / etc, se evalúa una vez y se establece para siempre en el directorio en el que se evaluó la ruta. Si en cambio modifica la ruta actual, entonces Cada vez que ejecutes el script tu ruta crecerá.
Para solucionar estos problemas, creo una función y la utilicé. No modifica su entorno y es fácil de usar:
function npm-exec {
$(npm bin)/$@
}
Esto se puede usar de esta manera sin realizar ningún cambio en su entorno:
npm-exec r.js <args>
Me encantaría saber si es una idea insegura / mala, pero después de pensarlo un poco no veo ningún problema aquí:
Modificando la solución insegura de Linus para agregarla al final, usando npm bin
para encontrar el directorio, y haciendo que el script solo llame a npm bin
cuando un package.json
está presente en uno de los padres (por velocidad), esto es lo que se me ocurrió zsh
:
find-up () {
path=$(pwd)
while [[ "$path" != "" && ! -e "$path/$1" ]]; do
path=${path%/*}
done
echo "$path"
}
precmd() {
if [ "$(find-up package.json)" != "" ]; then
new_bin=$(npm bin)
if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
export NODE_MODULES_PATH=$new_bin
fi
else
if [ "$NODE_MODULES_PATH" != "" ]; then
export PATH=${PATH%:$NODE_MODULES_PATH}
export NODE_MODULES_PATH=""
fi
fi
}
Para bash
, en lugar de usar el precmd
, puedes usar la variable $PROMPT_COMMAND
(no he probado esto pero tienes la idea):
__add-node-to-path() {
if [ "$(find-up package.json)" != "" ]; then
new_bin=$(npm bin)
if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
export NODE_MODULES_PATH=$new_bin
fi
else
if [ "$NODE_MODULES_PATH" != "" ]; then
export PATH=${PATH%:$NODE_MODULES_PATH}
export NODE_MODULES_PATH=""
fi
fi
}
export PROMPT_COMMAND="__add-node-to-path"
Me encontré con el mismo problema y no me gusta particularmente usar alias (como se sugiere con ), y si no te gustan también, aquí hay otra solución que utilizo, primero debes crear un pequeño script bash ejecutable. decir setenv.sh :
#!/bin/sh
# Add your local node_modules bin to the path
export PATH="$(npm bin):$PATH"
# execute the rest of the command
exec "$@"
y luego puede usar cualquier archivo ejecutable en su local /bin
usando este comando:
./setenv.sh <command>
./setenv.sh 6to5-node server.js
./setenv.sh grunt
Si estás usando scripts
en package.json entonces:
...,
scripts: {
''start'': ''./setenv.sh <command>''
}
Para Windows usa esto:
/* cmd into "node_modules" folder */
"%CD%/.bin/grunt" --version
Prefiero no confiar en los alias de shell u otro paquete.
Agregando una línea simple a la sección de scripts
de su package.json
, puede ejecutar comandos locales npm como
npm run webpack
paquete.json
{ "scripts": { "test": "echo /"Error: no test specified/" && exit 1", "webpack": "webpack" }, "devDependencies": { "webpack": "^4.1.1", "webpack-cli": "^2.0.11" } }
Si desea mantener npm, entonces npx debería hacer lo que necesita.
Si cambiar a hilo (un reemplazo de npm por Facebook) es una opción para usted, entonces puede llamar al:
yarn yourCmd
los scripts dentro de package.json tendrán prioridad, si no se encuentra ninguno, se verá dentro de la carpeta ./node_modules/.bin/
.
También produce lo que funcionó:
$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"
Por lo tanto, no tiene que configurar scripts para cada comando en su package.json
.
Si tenía un script definido en .scripts
dentro de su package.json
:
"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first
yarn tsc
sería equivalente al yarn run tsc
o npm run tsc
:
yarn tsc
yarn tsc v0.27.5
$ tsc
Si desea que su variable PATH se actualice correctamente en función de su directorio de trabajo actual, agregue esto al final de su equivalente .bashrc
(o después de cualquier cosa que defina PATH
):
__OLD_PATH=$PATH
function updatePATHForNPM() {
export PATH=$(npm bin):$__OLD_PATH
}
function node-mode() {
PROMPT_COMMAND=updatePATHForNPM
}
function node-mode-off() {
unset PROMPT_COMMAND
PATH=$__OLD_PATH
}
# Uncomment to enable node-mode by default:
# node-mode
Esto puede agregar un breve retraso cada vez que se procesa el indicador de bash (dependiendo del tamaño de su proyecto, lo más probable), por lo que está deshabilitado de forma predeterminada.
Puede habilitarlo y deshabilitarlo dentro de su terminal ejecutando node-mode
node-mode-off
y el node-mode
node-mode-off
, respectivamente.
Siempre he usado el mismo enfoque que @guneysus para resolver este problema, que es crear un script en el archivo package.json y usarlo ejecutando npm run script-name.
Sin embargo, en los últimos meses he estado usando npx y me encanta.
Por ejemplo, descargué un proyecto de Angular y no quería instalar la CLI de Angular a nivel mundial. Entonces, con npx instalado, en lugar de usar el comando global angular cli (si lo hubiera instalado) así:
ng serve
Puedo hacer esto desde la consola:
npx ng serve
Soy un usuario de Windows
y esto es lo que funcionó para mí:
// First set some variable - i.e. replace is with "xo"
D:/project/root> set xo="./node_modules/.bin/"
// Next, work with it
D:/project/root> %xo%/bower install
Buena suerte.
También puede usar direnv y cambiar la variable $ PATH solo en su carpeta de trabajo.
$ cat .envrc
> export PATH=$(npm bin):$PATH
Use npm run[-script] <script name>
Después de usar npm para instalar el paquete bin en su directorio local ./node_modules
, modifique package.json
para agregar <script name>
esta manera:
$ npm install --save learnyounode
$ edit packages.json
>>> in packages.json
...
"scripts": {
"test": "echo /"Error: no test specified/" && exit 1",
"learnyounode": "learnyounode"
},
...
$ npm run learnyounode
Sería bueno si npm install tuviera una opción --add-script o algo así o si npm run funcionaría sin agregar al bloque de scripts.
Use el comando npm bin
para obtener el directorio de módulos de nodo / bin de su proyecto
$ $(npm bin)/<binary-name> [args]
p.ej
$ $(npm bin)/bower install
Utilice npm-run
.
Desde el readme:
npm-run
Encuentra y ejecuta ejecutables locales desde node_modules
Cualquier ejecutable disponible para un script de ciclo de vida de npm está disponible para npm-run
.
Uso
$ npm install mocha # mocha installed in ./node_modules
$ npm-run mocha test/* # uses locally installed mocha executable
Instalación
$ npm install -g npm-run
¡Ya no tienes que manipular $PATH
!
Desde [email protected] , npm se envía con el paquete npx
, que le permite ejecutar comandos desde un node_modules/.bin
local node_modules/.bin
o desde un caché central.
Simplemente ejecute:
$ npx [options] <command>[@version] [command-arg]...
Por defecto, npx
verificará si <command>
existe en $PATH
, o en los archivos binarios del proyecto local, y lo ejecutará.
Llamar a npx <command>
cuando <command>
no esté en su $PATH
instalará automáticamente un paquete con ese nombre del registro de NPM para usted, y lo invocará. Cuando termine, el paquete instalado no estará en ninguna parte de sus globales, por lo que no tendrá que preocuparse por la contaminación a largo plazo. Puede evitar este comportamiento proporcionando la --no-install
.
Para npm < 5.2.0
, puede instalar el paquete npx
manualmente ejecutando el siguiente comando:
$ npm install -g npx
zxc es como "bundle exec" para nodejs. Es similar a usar PATH=$(npm bin):$PATH
:
$ npm install -g zxc
$ npm install gulp
$ zxc which gulp
/home/nathan/code/project1/node_modules/.bin/gulp
ACTUALIZACIÓN : Como Seyeong Jeong señala en su respuesta a continuación, desde npm 5.2.0 puede usar npx [command]
, que es más conveniente.
ANTIGUA RESPUESTA para versiones anteriores a 5.2.0 :
El problema con poner
./node_modules/.bin
en su RUTA es que solo funciona cuando su directorio de trabajo actual es la raíz de la estructura de directorios de su proyecto (es decir, la ubicación de los node_modules
)
Independientemente de cuál sea su directorio de trabajo, puede obtener la ruta de los binarios instalados localmente con
npm bin
Para ejecutar un binario de coffee
instalado localmente, independientemente de dónde se encuentre en la jerarquía del directorio del proyecto, puede usar esta construcción bash
PATH=$(npm bin):$PATH coffee
Alias esto a npm-exec
alias npm-exec=''PATH=$(npm bin):$PATH''
Así que ahora puedo
npm-exec coffee
Para ejecutar la copia correcta de café no importa de donde estoy
$ pwd
/Users/regular/project1
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee
$ cd lib/
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee
$ cd ~/project2
$ npm-exec which coffee
/Users/regular/project2/node_modules/.bin/coffee
Actualización: ya no recomiendo este método, tanto por los motivos de seguridad mencionados como por npm bin
comando npm bin
más npm bin
. Respuesta original a continuación:
Como se ha ./node_modules/.bin
, todos los binarios instalados localmente están en ./node_modules/.bin
. Para ejecutar siempre los binarios en este directorio en lugar de los binarios disponibles globalmente, si están presentes, le sugiero que coloque primero ./node_modules/.bin
en su ruta:
export PATH="./node_modules/.bin:$PATH"
Si coloca esto en su ~/.profile
, El coffee
siempre será ./node_modules/.bin/coffee
si está disponible, de lo contrario /usr/local/bin/coffee
(o cualquier prefijo en el que esté instalando módulos de nodos).