¿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_modulesy 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 execen 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 -gbandera 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 niftycommandy luegoniftycommand. Pero esto nunca funcionará a menos que tenga ./node_modules/.bin en su camino, ¿verdad?coffeecomando en lanpm scriptssección, como"build": "coffee -co target/directory source/directoy", so you can runnpm run build` desde el terminal después.npxque viene connpm 5.2.0medium.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
coffeebinario 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 binbusca 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.PATHhabrá 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
npxpaquete que le permite ejecutar comandos desde un localnode_modules/.bincaché o central.Simplemente ejecute:
Por defecto,
npxverificará si<command>existe$PATHo 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-installopción.Para
npm < 5.2.0, puede instalar elnpxpaquete manualmente ejecutando el siguiente comando:fuente
npmypackage.jsonproporciona casi la misma funcionalidad.npxes cojo. Debería haber sidonpm runonpm execo algo así.npm run [my-local-package]no funciona en mi Ubuntu, aunque parecía funcionar en un dispositivo con Windows.Use el
npm bincomando para obtener el directorio de módulos de nodo / bin de su proyectop.ej
fuente
export PATH="./node_modules/.bin:$PATH"$(npm bin)/jasmineno 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_modulesdirectorio local , modifíquelopackage.jsonpara 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 installese 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 startpara 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 *.jsnpm run ts-nodeno 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 bincomando . 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/.binprimero en su ruta:Si pone esto en su
~/.profile,coffeesiempre estará./node_modules/.bin/coffeedisponible, 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 bindirectorio independientemente de laPATHvar; ¿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 utilizanpmprogramas 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
nSi 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
.scriptsdentro de supackage.json:yarn tscsería equivalente ayarn run tsconpm run tsc:fuente
actualización: si está en el npm reciente (versión> 5.2)
Puedes usar:
npxbusca el comando en el.bindirectorio de sunode_modulesvieja respuesta:
Para ventanas
Almacene lo siguiente en un archivo llamado
npm-exec.baty agréguelo a su%PATH%Uso
Entonces puedes usarlo como
npm-exec <command> <arg0> <arg1> ...Por ejemplo
Para ejecutar
wdioinstalado en el directorio local node_modules, haga:es decir, se ejecutará
.\node_modules\.bin\wdio wdio.conf.jsfuente
Prefiero no confiar en alias de shell u otro paquete.
Al agregar una línea simple a la
scriptssección de supackage.json, puede ejecutar comandos locales npm comonpm run webpackpackage.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
.bashrcequivalente (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-modeynode-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 llamarcoffeeo 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
cdcomando, y después de cada llamadacdlo verificanode_modules/.biny lo agrega a su$PATH.nota2 : puede cambiar la tercera línea a
NODE_MODULES=$(npm bin);. Pero eso haría que elcdcomando fuera demasiado lento.fuente
$(npm bin)lugar de codificar./node_modules/.bin.$(npm bin)parece demasiado lento para usar con cadacdcomando. 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
/binusando este comando:Si está utilizando
scriptspackage.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 binpara encontrar el directorio y haciendo que el script solo llamenpm bincuando hay unpackage.jsonpresente en un padre (por velocidad), esto es lo que se me ocurriózsh:Para
bash, en lugar de usar elprecmdgancho, puede usar la$PROMPT_COMMANDvariable (no lo he probado pero se entiende):fuente
npm binal final de$PATHpuede 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
Windowsusuario y esto es lo que funcionó para mí:Buena suerte.
fuente
En caso de que esté usando
fish shelly no quiera agregar$pathpor razones de seguridad. Podemos agregar la siguiente función para ejecutar ejecutables de nodo local.Ahora puedes ejecutar cosas como:
n coffeeo más argumentos como:
n browser-sync --versionTenga en cuenta que si es
bashusuario, 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 svgotan bien comonpm installcon package.json. Ambos métodos se instalaron "correctamente", pero el comando "svgo" aún no está disponible.grunt-clipaquete globalmente, luego en el directorio de su proyecto instale cualquier versión (modificada) delgruntpaquete, luego, cuando lo ejecutegrunt, usará esta versión local.