我正在构建一个由内置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-b
,package.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。谁能告诉我怎么能让它发挥作用呢?
答案 0 :(得分:9)
两件事。
cake install
或cake build
作为scripts.install字段。这将在本地安装 coffee-script之后运行,并且其bin已正确链接(在Windows上使用垫片),并将以PATH环境运行,以便本地安装的cake
为在系统路径中使用而不是其他任何东西。./node_modules/.bin/cake
或./node_modules/.bin/coffee
而非潜入包裹内部。如果您没有使用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