typ*_*ror 441 node.js coffeescript npm node-modules
我如何使用本地版本的模块node.js
.例如,在我的应用程序中,我安装了coffee-script:
npm install coffee-script
Run Code Online (Sandbox Code Playgroud)
这将安装它./node_modules
并且coffee命令在./node_modules/.bin/coffee
.当我在项目的主文件夹中时,有没有办法运行此命令?我想我正在寻找类似于bundle exec
捆绑器的东西.基本上,我想指定一个与项目有关的每个人都应该使用的咖啡脚本版本.
我知道我可以添加-g
标志来全局安装它,这样咖啡在任何地方都可以正常工作,但如果我想在每个项目中使用不同版本的咖啡呢?
reg*_*lar 520
更新:正如Seyeong Jeong在下面的回答中指出的,因为你可以使用npm 5.2.0 npx [command]
,这样更方便.
对于5.2.0之前的版本,OLD ANSWER:
推杆的问题
./node_modules/.bin
Run Code Online (Sandbox Code Playgroud)
进入你的PATH是它只有当你的当前工作目录是项目目录结构的根目录(即位置node_modules
)时才有效
与您的工作目录无关,您可以获取本地安装的二进制文件的路径
npm bin
Run Code Online (Sandbox Code Playgroud)
要coffee
独立于项目目录层次结构中的位置执行本地安装的二进制文件,可以使用此bash构造
PATH=$(npm bin):$PATH coffee
Run Code Online (Sandbox Code Playgroud)
我把这个别名给了npm-exec
alias npm-exec='PATH=$(npm bin):$PATH'
Run Code Online (Sandbox Code Playgroud)
所以,现在我可以
npm-exec coffee
Run Code Online (Sandbox Code Playgroud)
无论我在哪里,都要运行正确的咖啡副本
$ 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
Run Code Online (Sandbox Code Playgroud)
Sey*_*ong 363
你不必再操纵$PATH
了!
从npm@5.2.0开始,npm附带了一个npx
包,它允许您从本地node_modules/.bin
或中央缓存运行命令.
简单地运行:
$ npx [options] <command>[@version] [command-arg]...
Run Code Online (Sandbox Code Playgroud)
默认情况下,npx
将检查是否<command>
存在于$PATH
本地项目二进制文件中,并执行该操作.
调用npx <command>
何时<command>
尚未在您的$PATH
遗嘱中自动从NPM注册表中为您安装具有该名称的包,并调用它.完成后,安装的软件包将不会出现在全局文件中的任何位置,因此您不必长期担心污染问题.您可以通过提供--no-install
选项来阻止此行为.
对于npm < 5.2.0
,您可以npx
通过运行以下命令手动安装包:
$ npm install -g npx
Run Code Online (Sandbox Code Playgroud)
jas*_*ssa 92
使用该npm bin
命令获取项目的node modules/bin目录
$ $(npm bin)/<binary-name> [args]
Run Code Online (Sandbox Code Playgroud)
例如
$ $(npm bin)/bower install
Run Code Online (Sandbox Code Playgroud)
jla*_*jla 76
使用 npm run[-script] <script name>
使用npm将bin包安装到本地./node_modules
目录后,修改package.json
为这样添加<script name>
:
$ npm install --save learnyounode
$ edit packages.json
>>> in packages.json
...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"learnyounode": "learnyounode"
},
...
$ npm run learnyounode
Run Code Online (Sandbox Code Playgroud)
如果npm install有一个--add-script选项或者某个东西,或者如果npm run在没有添加脚本块的情况下运行会很好.
mig*_*iam 42
使用npm-run
.
从自述文件:
可以使用npm生命周期脚本可用的任何可执行文件npm-run
.
$ npm install mocha # mocha installed in ./node_modules
$ npm-run mocha test/* # uses locally installed mocha executable
Run Code Online (Sandbox Code Playgroud)
$ npm install -g npm-run
Run Code Online (Sandbox Code Playgroud)
Lin*_*iel 40
更新:我不再推荐这种方法,既出于上述安全原因,也不是最新的npm bin
命令.原答案如下:
正如您所知,任何本地安装的二进制文件都在./node_modules/.bin
.为了始终在此目录中运行二进制文件而不是全局可用的二进制文件(如果存在),我建议您./node_modules/.bin
先放入路径:
export PATH="./node_modules/.bin:$PATH"
Run Code Online (Sandbox Code Playgroud)
如果你把它放在你的中~/.profile
,coffee
将永远是./node_modules/.bin/coffee
可用的,否则/usr/local/bin/coffee
(或者你在下面安装节点模块的任何前缀).
Bob*_*630 22
PATH解决方案的问题是,如果将$(npm bin)放在.profile/.bashrc/etc中,它将被评估一次,并永远设置为首先评估路径的目录.如果改为修改当前路径,则每次运行脚本时,您的路径都会增长.
为了解决这些问题,我创建了一个函数并使用了它.它不会修改您的环境并且易于使用:
function npm-exec {
$(npm bin)/$@
}
Run Code Online (Sandbox Code Playgroud)
然后可以像这样使用它而不对您的环境进行任何更改:
npm-exec r.js <args>
Run Code Online (Sandbox Code Playgroud)
k0p*_*kus 21
如果你想保持npm,那么npx应该做你需要的.
如果切换到纱线(由facebook替换为npm)是您的选择,那么您可以致电:
yarn yourCmd
Run Code Online (Sandbox Code Playgroud)
package.json中的脚本优先,如果没有找到,它将在./node_modules/.bin/
文件夹中查找.
它还输出它运行的内容:
$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"
Run Code Online (Sandbox Code Playgroud)
因此,您不必为您的每个命令设置脚本package.json
.
如果你.scripts
在你的内部定义了一个脚本package.json
:
"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first
Run Code Online (Sandbox Code Playgroud)
yarn tsc
相当于yarn run tsc
或npm run tsc
:
yarn tsc
yarn tsc v0.27.5
$ tsc
Run Code Online (Sandbox Code Playgroud)
您可以使用:
npx <command>
Run Code Online (Sandbox Code Playgroud)
npx
在.bin
目录中查找命令node_modules
将以下内容存储在一个名为的文件中npm-exec.bat
,并将其添加到您的%PATH%
@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET modules=%%i
"%modules%"\%*
Run Code Online (Sandbox Code Playgroud)
然后你可以像
npm-exec <command> <arg0> <arg1> ...
例如
要执行wdio
安装在本地node_modules目录中的操作,请执行以下操作:
npm-exec wdio wdio.conf.js
Run Code Online (Sandbox Code Playgroud)
即它将运行 .\node_modules\.bin\wdio wdio.conf.js
我更喜欢不依赖shell别名或其他包.
在scripts
你的部分添加一个简单的行package.json
,你可以运行本地的npm命令
npm run webpack
的package.json
scripts
如果您希望PATH变量根据当前工作目录正确更新,请将其添加到.bashrc
等效的末尾(或在定义的任何内容之后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
Run Code Online (Sandbox Code Playgroud)
这可能会在每次呈现bash提示时添加一个短暂的延迟(最有可能取决于项目的大小),因此默认情况下禁用它.
您可以分别通过运行node-mode
和在终端内启用和禁用它node-mode-off
.
我总是使用与@guneysus相同的方法来解决这个问题,即在package.json文件中创建一个脚本并使用它运行npm run script-name.
然而,在最近几个月我一直在使用npx,我喜欢它.
例如,我下载了一个Angular项目,我不想全局安装Angular CLI.因此,安装了npx,而不是使用全局角度cli命令(如果我已安装它),如下所示:
ng serve
Run Code Online (Sandbox Code Playgroud)
我可以从控制台执行此操作:
npx ng serve
Run Code Online (Sandbox Code Playgroud)
TL;DR:npm exec
与npm@>=7
.
npx
其他答案中提到的命令已完全重写,npm@7
默认情况下随附node@15
并可以安装在node@>=10
. 该实现现在等同于新引入的npm exec
命令,它与之前的npx
命令实现类似但不等于。
一个区别是,例如,当依赖项尚未安装时,它总是以交互方式询问是否应下载依赖项(也可以用参数--yes
或覆盖--no
)。
下面是一个例子npm exec
。双破折号 ( --
) 将npm exec
参数与实际命令参数分开:
npm exec --no -- jest --coverage
Run Code Online (Sandbox Code Playgroud)
另请参阅更新的官方文档npm exec
。