2011-12-21 5 views
12

Tôi đang xây dựng một ứng dụng bao gồm private npm repos được xây dựng trong CoffeeScript. Để tiếp tục triển khai ngôn ngữ thuyết bất khả tri và cho phép mỗi ứng dụng chỉ định phiên bản CoffeeScript của nó, tôi bao gồm CoffeeScript là phụ thuộc trong mỗi thư viện và xây dựng thành JavaScript khi cài đặt npm.Soạn thảo coffeescript trên npm install

cài đặt npm hoạt động tốt cho bản repo độc lập, nhưng không thành công khi tôi cố gắng cài đặt một repo phụ thuộc vào một repo khác đang được xây dựng.

Vì vậy, nếu tôi có repo-a, mà package.json bao gồm này:

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

repo-b, mà package.json bao gồm này:

"dependencies": { 
    "coffee-script": "~1.2.0", 
    "repo-a": "git+ssh://[email protected]:myrepo.git" 
}, 
"scripts": { 
    "install": "./node_modules/coffee-script/bin/cake install" 
} 

nơi cả hai đều có một Cakefile trông như thế này, với một install công việc được gọi trên một npm install móc:

{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 công trình cho cho repo-a, nhưng không cho repo-b với tin nhắn này:

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

tại thời điểm đó một ___coffee-script.npm thư mục dở dang tồn tại trong node_modules.

Tất nhiên sẽ dễ dàng hơn khi sử dụng app.js wrapper, nhưng tôi cần triển khai JavaScript, không phải CoffeeScript. Bất cứ ai có thể cho tôi biết làm thế nào tôi có thể nhận được điều này để làm việc?

+0

cho những gì nó có giá trị, phương pháp này hoạt động khi tôi dựa vào một số nhị phân 'bánh' toàn cầu, và chỉ thất bại vì tôi chỉ định 'bánh' được cài đặt cục bộ. –

Trả lời

9

Hai thứ.

  1. Nếu bạn đang chạy bánh từ lệnh npm, bạn chỉ có thể chỉ định cake install hoặc cake build làm trường scripts.install. Điều này sẽ chạy sau tập lệnh cà phê được cài đặt cục bộ và thùng rác được liên kết thích hợp (với cửa sổ bật lên) và sẽ chạy với môi trường PATH sao cho cài đặt cake cục bộ được sử dụng thay vì bất kỳ thứ gì khác trong đường dẫn hệ thống .
  2. Nếu bạn đang không chạy lệnh này từ lệnh npm, nhưng bạn vẫn kỳ vọng rằng tập lệnh cà phê đã được cài đặt cục bộ qua npm (trông giống như vậy), thì có thể bạn đang nhấn ./node_modules/.bin/cake hoặc ./node_modules/.bin/coffee thay vì hơn lặn vào bên trong gói.

Nếu bạn không cài đặt cà phê kịch bản với NPM, nhưng thay vì sử dụng một số submodules git hoặc một cái gì đó, sau đó bạn đang ở trên của riêng bạn :)

+1

cảm ơn nhiều, isaac. tôi đã không nhận ra phạm vi của npm mở rộng đến 'bin', đó là tin tuyệt vời. tôi càng tìm hiểu về "npm công cụ" (như trái ngược với "npm repo repos") tôi càng thích nó. đó là một phần mềm tuyệt vời. –

+1

Việc thêm 'node_modules/.bin /' vào 'PATH' (1.) thực sự gọn gàng vì chúng ta chỉ có thể sử dụng các tệp nhị phân của node_module như các tệp nhị phân thông thường. Cảm ơn bạn đã chia sẻ mẹo tuyệt vời này! – abernier

4

Tôi khuyên bạn nên xây dựng cục bộ JS và lưu trữ các gói đã biên dịch thành các tệp tar.gz trên S3. Để phát triển địa phương, bạn có thể npm link và trong quá trình sản xuất bạn trỏ đến url lưu trữ. Nếu bạn không muốn phiên bản phụ thuộc của bạn, bạn chỉ có thể có cùng một url cập nhật hơn và hơn.

Hãy ghi nhớ lỗi npm này: https://github.com/isaacs/npm/issues/1727 (về cơ bản bạn sẽ phải xóa thư mục node_modules của mình mỗi khi bạn cập nhật các giá trị trên ứng dụng sử dụng url git/http làm số phiên bản).

--fg

+0

Tuyệt vời, cảm ơn con trỏ, Felix. Tôi nghĩ rằng tôi sẽ kết thúc với [@ jashkenas's solution] (http://twitter.com/jashkenas/status/149516518802198528) cho bây giờ, và biên dịch mà không cần lệnh từ module được cung cấp. –