0

我认为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总是解析为正确的可执行文件吗?
4

1 回答 1

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。

于 2012-08-13T02:52:01.107 回答