在npm install上编译coffeescript

时间:2011-12-21 15:03:51

标签: node.js coffeescript npm

我正在构建一个由内置CoffeeScript的private npm repos组成的应用。为了保持部署语言无关,并允许每个应用程序指定其CoffeeScript版本,我将CoffeeScript作为依赖项包含在每个库中,并在安装npm时构建为JavaScript。

npm安装适用于独立存储库,但是当我尝试安装依赖于正在构建的另一个存储库的存储库时失败。

所以,如果我有repo-a,其package.json包含此内容:

"dependencies": {
  "coffee-script": "~1.2.0"
},
"scripts": {
  "install": "./node_modules/coffee-script/bin/cake install"
}

repo-bpackage.json包含此内容:

"dependencies": {
  "coffee-script": "~1.2.0",
  "repo-a": "git+ssh://git@mydomain.com:myrepo.git"
},
"scripts": {
  "install": "./node_modules/coffee-script/bin/cake install"
}

其中两个都有一个Cakefile看起来像这样,install任务在npm install挂钩上调用:

{print} = require "util"
{spawn} = require "child_process"

coffee = "./node_modules/coffee-script/bin/coffee"

echo = (child) ->
  child.stdout.on "data", (data) -> print data.toString()
  child.stderr.on "data", (data) -> print data.toString()
  child

install = (cb) ->
  console.log "Building..."
  echo child = spawn coffee, ["-c", "-o", "lib", "src"]
  child.on "exit", (status) -> cb?() if status is 0

task "install", "Install, build, and test repo", install

npm install适用于repo-a,但repo-b无法使用此消息:

sh: ./node_modules/coffee-script/bin/cake: No such file or directory

此时___coffee-script.npm中存在未完成的node_modules目录。

当然使用app.js wrapper要容易得多,但我需要部署JavaScript,而不是CoffeeScript。谁能告诉我怎么能让它发挥作用呢?

2 个答案:

答案 0 :(得分:9)

两件事。

  1. 如果您正在使用npm命令运行cake,则可以指定cake installcake build作为scripts.install字段。这将在本地安装 coffee-script之后运行,并且其bin已正确链接(在Windows上使用垫片),并将以PATH环境运行,以便本地安装的cake为在系统路径中使用而不是其他任何东西。
  2. 如果你从npm命令运行它,但是你仍然希望咖啡脚本已经通过npm本地安装(它看起来像),那么你应该是点击./node_modules/.bin/cake./node_modules/.bin/coffee而非潜入包裹内部。
  3. 如果您没有使用npm安装coffee-script,而是使用一些git子模块或其他东西,那么你就是自己:)

答案 1 :(得分:4)

我建议在本地构建JS并将编译的包存储为S3上的tar.gz文件。对于本地开发,您可以npm link并在生产中指向存档URL。如果您不想对依赖项进行版本设置,则可以反复更新相同的URL。

请记住这个npm错误:https://github.com/isaacs/npm/issues/1727(每次更新使用git / http urls作为版本号的应用程序上的deps时,你基本上都必须擦除node_modules文件夹。)

- FG