NPM package.json依赖项及其在本地和全局中的可执行文件

时间:2012-08-10 03:06:28

标签: node.js npm

我认为npm install|update在需要源文件中的依赖项时有效,但是当我想运行可执行文件时,如nodemon,它似乎不起作用。它是否试图在全球范围内查找文件?如何首先在node_modules中查看这些命令?


我有一个Cakefile,用nodemon启动开发服务器。例如:

# **`procExec(procName)`**
# returns the path to executable in `node_`
procExec = (procName) -> 
    console.log "./node_modules/" + procName + "/bin/" + procName
    "./node_modules/.bin/" + procName

# **`cake startdev`**
# Starts the server with `nodemon`
# Watch and compile `.coffee` and `.styl` files in `/client`

task "startdev", "Starts server with nodemon and watch files for changes", ->
    # start nodemon server
    nodemon = spawn procExec("nodemon"), ["server.coffee"]
    processOutput nodemon

    # watch and compile CoffeeScript
    coffee = spawn procExec("coffee"), ["-o", "public/js/app", "-cw", "client/coffee"]
    processOutput coffee

    # watch and compile Stylus
    stylus = spawn procExec("stylus"), ["client/stylus", "-l", "-w", "-o", "public/css/app"]
    processOutput stylus

它有效,但有一些小问题:

  • npm install|update似乎无法安装nodemon。我认为它试图全局安装并失败。我分别手动做了npm install nodemon。为什么是这样?我怎么能告诉nodemon无论如何安装?
  • "./node_modules/.bin/" + procName是否始终解析为正确的可执行文件?

1 个答案:

答案 0 :(得分:2)

这里有几个问题,所以我会尝试将它们分开。

  

npm install | update似乎没有安装nodemon。我认为它试图全局安装并失败。我分别手动执行了npm install nodemon。为什么是这样?如何告诉nodemon无论如何都要安装?

您是否看到有关“首选全局安装”的警告?如果是这种情况,它只是一个警告,它将会被安装。如果是不同的错误,请包含输出。

  

“./node_modules/.bin/”+ procName是否始终解析为正确的可执行文件?

是的,依赖项的package.json文件中列出的任何脚本都将安装到此文件夹中。但是,我更喜欢使用npm bin命令来始终获得正确的路径。

如果您是从节点生成流程,您还可以require('npm')并修改process.env.PATH以获得正确的node_modules/.bin。例如。在Cakefile的顶部:

npm = require 'npm'
npm.load (err) -> throw err # If config fails to load, bail out early
process.env.PATH = npm.bin + ":" + process.env.PATH
# Now you no longer need to use procExec in your tasks

免责声明我不知道修改这样的PATH是否适用于Windows。