nodejs node_modules mac instalar como node.js coffeescript npm node-modules

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).