Компиляция coffeescript при установке npm - PullRequest
12 голосов
/ 21 декабря 2011

Я создаю приложение, состоящее из частных репозиториев npm , встроенных в CoffeeScript.Чтобы не зависеть от языка развертывания и позволить каждому приложению указывать свою версию CoffeeScript, я включаю CoffeeScript в качестве зависимости в каждую библиотеку и встраиваю в JavaScript при установке npm.

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

, и в этот момент в node_modules существует незаконченный каталог ___coffee-script.npm.

Конечно, было бы намного проще использовать app.js обертку , но мне нужно развернуть JavaScript, а не CoffeeScript.Может кто-нибудь сказать мне, как я мог заставить это работать?

Ответы [ 2 ]

9 голосов
/ 29 декабря 2011

Две вещи.

  1. Если вы запускаете торт по команде npm, вы можете просто указать cake install или cake build в качестве поля scripts.install.Он будет запускаться после того, как coffee-script будет установлен локально, и его корзина связана соответствующим образом (с прокладкой на окнах), и будет работать с окружением PATH, так что вместо установленного локально устанавливается cakeчто-нибудь еще в системном пути.
  2. Если вы не запускаете это из команды npm, но, тем не менее, ожидаете, что coffee-script уже был установлен локально через npm (который онвыглядит так), тогда вам, вероятно, следует нажимать ./node_modules/.bin/cake или ./node_modules/.bin/coffee, а не погружаться во внутренние компоненты пакета.

Если вы не устанавливаете coffee-script с npm, а вместо этого используете какой-то gitсубмодули или что-то, то вы сами по себе:)

4 голосов
/ 21 декабря 2011

Я бы порекомендовал локально собрать JS и сохранить скомпилированные пакеты как tar.gz файлы на S3. Для локального развития вы можете npm link, а в производственном процессе вы указываете на URL архива. Если вы не хотите создавать версии своих зависимостей, вы можете просто обновлять один и тот же URL снова и снова.

Помните об этой ошибке npm: https://github.com/isaacs/npm/issues/1727 (вам, в основном, придется стирать папку node_modules каждый раз, когда вы обновляете deps в приложении, использующем URL-адреса git / http в качестве номеров версий).

- фг

...