¿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 ./node_modules
y el comando coffee está en./node_modules/.bin/coffee
. ¿Hay alguna manera 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
bandera para instalarlo globalmente para que el café funcione bien en cualquier lugar, pero ¿y si quisiera tener diferentes versiones de café por proyecto?
node.js
coffeescript
npm
node-modules
typeoneerror
fuente
fuente
npm install niftycommand
y luegoniftycommand
. Pero esto nunca funcionará a menos que tenga ./node_modules/.bin en su camino, ¿verdad?coffee
comando en lanpm scripts
sección, como"build": "coffee -co target/directory source/directoy", so you can run
npm run build` desde el terminal después.npx
que viene connpm 5.2.0
medium.com/@maybekatz/…Respuestas:
ACTUALIZACIÓN : Como Seyeong Jeong señala en su respuesta a continuación, desde npm 5.2.0 puede usar
npx [command]
, lo cual es más conveniente.ANTIGUA RESPUESTA para versiones anteriores a 5.2.0 :
El problema con poner
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
node_modules
)Independientemente de cuál sea su directorio de trabajo, puede obtener la ruta de los binarios instalados localmente con
Para ejecutar un
coffee
binario instalado localmente, independientemente de dónde se encuentre en la jerarquía del directorio del proyecto, puede usar esta construcción bashAlias esto a npm-exec
Entonces ahora puedo
para ejecutar la copia correcta de café sin importar dónde esté
fuente
alias coffee="npm-exec coffee"
npm bin
busca en la cadena de 'directorios ancestros' al cwd un directorio node_modules. Este es exactamente el comportamiento deseado si desea utilizar específicamente los binarios de los módulos enumerados en el paquete del proyecto .json.PATH
habrá de nuevo a lo que era antes de la invocación de mandato. Establecer una variable de entorno en la misma línea, antes de ejecutar un comando, solo afecta el entorno de ese comando.¡Ya no tienes que manipular
$PATH
!Desde [email protected] , npm se envía con un
npx
paquete que le permite ejecutar comandos desde un localnode_modules/.bin
caché o central.Simplemente ejecute:
Por defecto,
npx
verificará si<command>
existe$PATH
o en los binarios locales del proyecto y lo ejecutará.Si llama
npx <command>
cuando aún<command>
no está en su$PATH
, se instalará automáticamente un paquete con ese nombre desde el registro de NPM 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 al proporcionar la--no-install
opción.Para
npm < 5.2.0
, puede instalar elnpx
paquete manualmente ejecutando el siguiente comando:fuente
npm
ypackage.json
proporciona casi la misma funcionalidad.npx
es cojo. Debería haber sidonpm run
onpm exec
o algo así.npm run [my-local-package]
no funciona en mi Ubuntu, aunque parecía funcionar en un dispositivo con Windows.Use el
npm bin
comando para obtener el directorio de módulos de nodo / bin de su proyectop.ej
fuente
export PATH="./node_modules/.bin:$PATH"
$(npm bin)/jasmine
no lo esnode $(npm bin)/jasmine
(probablemente lo descubriste pero aclaraste a los demás).Utilizar
npm run[-script] <script name>
Después de usar npm para instalar el paquete bin en su
./node_modules
directorio local , modifíquelopackage.json
para agregarlo<script name>
así: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.
fuente
npm install
ese momento tiene acceso a sus dependencias de desarrollo. El único inconveniente menor es que necesitasnpm run eslint
(o lo que sea). Puede crear una secuencia de comandos llamada "inicio" que ejecute gulp para que solo necesite escribirnpm start
para iniciar su servidor de desarrollo. Cosas geniales y nada de bondad, así que a tus amigos de Windows todavía les gustas. :)--
como:npm run learnyounode -- --normal-switches --watch -d *.js
npm run ts-node
no funciona para mí. Solo tendré que volver a ordenar a npx.Utilizar
npm-run
.Del léame:
npm-run
Encuentra y ejecuta ejecutables locales desde node_modules
Cualquier ejecutable disponible para un script de ciclo de vida npm está disponible para
npm-run
.Uso
Instalación
fuente
Actualización: ya no recomiendo este método, tanto por las razones de seguridad mencionadas como por las más recientes.
npm bin
comando . Respuesta original a continuación:Como descubrió, cualquier binario instalado localmente está en
./node_modules/.bin
. Para ejecutar siempre los archivos binarios en este directorio en lugar de los archivos binarios disponibles a nivel mundial, si está presente, le sugiero que ponga./node_modules/.bin
primero en su ruta:Si pone esto en su
~/.profile
,coffee
siempre estará./node_modules/.bin/coffee
disponible, de lo contrario/usr/local/bin/coffee
(o cualquier prefijo en el que esté instalando los módulos de nodo).fuente
./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
/tmp
), cualquier proceso o usuario puede secuestrar la sesión poniendo versiones maliciosas de los comandos ordinarios (comols
,cp
, etc.) allí. Estos pueden generar subcapas 'invisibles' que capturan sus contraseñas, etc.alias npm-exec='PATH=$(npm bin):$PATH'
es más elegante.PATH
, pero la última (usando el$(npm bin)
formulario)? para que no puedan sobrescribir sus cosas existentes, y ya habría estado confiando en los ejecutables en elnpm bin
directorio independientemente de laPATH
var; ¿sería el modelo de amenaza que a) alguien malicioso obtiene acceso a su sistema de archivos, b) agregan ejecutables con nombres cercanos a esas herramientas del sistema, yc) escribe mal? Tratando de comprender los escenarios que hacen que esto sea malo, dado que ya confía en ejecutables extranjeros cuando utilizanpm
programas instalados.La solución PATH tiene el problema de que si $ (npm bin) se coloca 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 por primera vez. Si en cambio modifica la ruta actual, entonces Cada vez que ejecute el script, su camino crecerá.
Para solucionar estos problemas, creo una función y la utilicé. No modifica su entorno y es fácil de usar:
Esto se puede usar así sin hacer ningún cambio en su entorno:
fuente
n
Si desea mantener npm, entonces npx debe hacer lo que necesita.
Si cambiar a hilo (un reemplazo de npm por facebook) es una opción para usted, puede llamar a:
las secuencias de comandos dentro del paquete.json tendrán prioridad, si no se encuentra ninguna, se verá dentro de
./node_modules/.bin/
carpeta.También genera lo que ejecutó:
Por lo tanto, no tiene que configurar scripts para cada comando en su
package.json
.Si tenía un script definido
.scripts
dentro de supackage.json
:yarn tsc
sería equivalente ayarn run tsc
onpm run tsc
:fuente
actualización: si está en el npm reciente (versión> 5.2)
Puedes usar:
npx
busca el comando en el.bin
directorio de sunode_modules
vieja respuesta:
Para ventanas
Almacene lo siguiente en un archivo llamado
npm-exec.bat
y agréguelo a su%PATH%
Uso
Entonces puedes usarlo como
npm-exec <command> <arg0> <arg1> ...
Por ejemplo
Para ejecutar
wdio
instalado en el directorio local node_modules, haga:es decir, se ejecutará
.\node_modules\.bin\wdio wdio.conf.js
fuente
Prefiero no confiar en alias de shell u otro paquete.
Al agregar una línea simple a la
scripts
sección de supackage.json
, puede ejecutar comandos locales npm comonpm run webpack
package.json
fuente
Si desea que su variable PATH se actualice correctamente en función de su directorio de trabajo actual, agregue esto al final de su
.bashrc
equivalente (o después de cualquier cosa que definaPATH
):Esto puede agregar un pequeño retraso cada vez que se procesa el indicador bash (según el 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
ynode-mode-off
, respectivamente.fuente
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 Angular y no quería instalar Angular CLI a nivel mundial. Entonces, con npx instalado, en lugar de usar el comando global angular cli (si lo hubiera instalado) así:
Puedo hacer esto desde la consola:
Aquí hay un artículo que escribí sobre NPX y que profundiza en él.
fuente
zxc es como "bundle exec" para nodejs. Es similar a usar
PATH=$(npm bin):$PATH
:fuente
La misma solución aceptada de @regular, pero sabor a concha de pescado
fuente
También puede usar direnv y cambiar la variable $ PATH solo en su carpeta de trabajo.
fuente
Agregue este script a su
.bashrc
. Entonces puedes llamarcoffee
o hacer cualquier cosa localmente. Esto es útil para su computadora portátil, pero no lo use en su servidor.nota : este script hace un alias de
cd
comando, y después de cada llamadacd
lo verificanode_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 elcd
comando fuera demasiado lento.fuente
$(npm bin)
lugar de codificar./node_modules/.bin
.$(npm bin)
parece demasiado lento para usar con cadacd
comando. He restaurado el código y agregué una nota.Para Windows use esto:
fuente
Encontré el mismo problema y no me gusta especialmente el uso de alias (como se sugiere con regularidad ), y si no te gustan también, aquí hay otra solución alternativa que uso, primero tienes que crear un pequeño script ejecutable bash, diga setenv.sh :
y luego puedes usar cualquier ejecutable en tu local
/bin
usando este comando:Si está utilizando
scripts
package.json, entonces:fuente
Me encantaría saber si esta es una idea insegura / mala, pero después de pensarlo un poco, no veo un problema aquí:
Modificando la solución insegura de Linus para agregarlo al final, usando
npm bin
para encontrar el directorio y haciendo que el script solo llamenpm bin
cuando hay unpackage.json
presente en un padre (por velocidad), esto es lo que se me ocurriózsh
:Para
bash
, en lugar de usar elprecmd
gancho, puede usar la$PROMPT_COMMAND
variable (no lo he probado pero se entiende):fuente
npm bin
al final de$PATH
puede no ejecutar lo que el usuario espera: ¡básicamente otro ejecutable pero más probablemente un paquete instalado globalmente con otra versión!Soy un
Windows
usuario y esto es lo que funcionó para mí:Buena suerte.
fuente
En caso de que esté usando
fish shell
y no quiera agregar$path
por razones de seguridad. Podemos agregar la siguiente función para ejecutar ejecutables de nodo local.Ahora puedes ejecutar cosas como:
n coffee
o más argumentos como:
n browser-sync --version
Tenga en cuenta que si es
bash
usuario, entonces las respuestas de @ Bob9630 son el camino a seguir aprovechando bash$@
, que no está disponible enfishshell
.fuente
Incluya coffee-script en package.json con la versión específica requerida en cada proyecto, típicamente así:
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.
fuente
npm install svgo
tan bien comonpm install
con package.json. Ambos métodos se instalaron "correctamente", pero el comando "svgo" aún no está disponible.grunt-cli
paquete globalmente, luego en el directorio de su proyecto instale cualquier versión (modificada) delgrunt
paquete, luego, cuando lo ejecutegrunt
, usará esta versión local.