2011-12-21 3 views
12

Я создаю приложение, состоящее из private npm repos, созданного в CoffeeScript. Чтобы сохранить язык развертывания-агностик и разрешить каждому приложению указывать свою версию CoffeeScript, я включаю CoffeeScript в качестве зависимости в каждой библиотеке и создаю JavaScript при установке npm.Компиляция coffeescript на npm install

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://[email protected]: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

за то, что он стоит, этот подход работает, когда я полагаюсь на глобальный двоичный файл 'cake' и только терпит неудачу, потому что я указываю локально установленную' cake'. –

ответ

9

Две вещи.

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

Если вы не устанавливаете кофе-скрипт с НПМ, но вместо того, чтобы использовать некоторые GIT подмодулях или что-то, то вы по своему усмотрению :)

+1

большое спасибо, isaac. я не осознал, что область npm распространяется на «bin», это потрясающие новости. тем больше я узнаю о «npm инструменте» (в отличие от «npm repo of repos»), тем больше я его люблю. это отличная программа. –

+1

Добавление 'node_modules/.bin /' в 'PATH' (1.) действительно опрятно, так как мы можем просто использовать двоичные файлы node_module как обычные. Спасибо, что поделились этим потрясающим трюком! – abernier

4

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

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

--fg

+0

Удивительный, спасибо за указатели, Феликс. Я думаю, что в итоге я перейду с решением [@ jashkenas] (http://twitter.com/jashkenas/status/149516518802198528) и компиляцией без команд из предоставленного модуля. –

 Смежные вопросы

  • Нет связанных вопросов^_^