2012-03-11 7 views
13

Tôi có một ứng dụng mà tôi đang triển khai cho Nodejitsu. Gần đây, họ gặp phải vấn đề về npm khiến ứng dụng của tôi chuyển sang ngoại tuyến trong vài giờ sau khi tôi thử (và không thành công) để khởi động lại, vì không thể cài đặt các phụ thuộc của ứng dụng. Tôi đã nói rằng điều này có thể được ngăn chặn trong tương lai bằng cách liệt kê tất cả các phụ thuộc của tôi là bundledDependencies trong package.json của tôi, khiến cho các phụ thuộc được tải lên cùng với phần còn lại của ứng dụng. Điều đó có nghĩa là tôi cần package.json của mình để trông giống như thế này:Có cách nào để tự động tạo danh sách phụ thuộc đi kèm không?

"dependencies": { 
    "express": "2.5.8", 
    "mongoose": "2.5.9", 
    "stylus": "0.24.0" 
}, 
"bundledDependencies": [ 
    "express", 
    "mongoose", 
    "stylus" 
] 

Bây giờ, trên cơ sở KHÔ, điều này là không hấp dẫn. Nhưng điều tồi tệ hơn là việc bảo trì: Mỗi khi tôi thêm hoặc xóa một phụ thuộc, tôi phải thực hiện thay đổi ở hai nơi. Có lệnh nào tôi có thể sử dụng để đồng bộ hóa bundledDependencies với dependencies không?

+0

PING :) Điều này có trả lời câu hỏi của bạn hoặc có điều gì khác cần giải quyết không? – wprl

Trả lời

10

Làm cách nào để triển khai tác vụ grunt.js? Công trình này:

module.exports = function(grunt) { 

    grunt.registerTask('bundle', 'A task that bundles all dependencies.', function() { 
    // "package" is a reserved word so it's abbreviated to "pkg" 
    var pkg = grunt.file.readJSON('./package.json'); 
    // set the bundled dependencies to the keys of the dependencies property 
    pkg.bundledDependencies = Object.keys(pkg.dependencies); 
    // write back to package.json and indent with two spaces 
    grunt.file.write('./package.json', JSON.stringify(pkg, undefined, ' ')); 
    }); 

}; 

Đặt tên đó vào thư mục gốc của dự án trong tệp có tên grunt.js. Để cài đặt grunt, hãy sử dụng npm: npm install -g grunt. Sau đó gói các gói bằng cách thực hiện grunt bundle.

Một commentor đề cập một module NPM có thể có ích: (. Tôi đã không thử nó) https://www.npmjs.com/package/grunt-bundled-dependencies

+0

lấy câu trả lời của bạn và tạo một thư viện .. https://github.com/GuyMograbi/grunt-bundled-dependencies. xin vui lòng xem xét thêm vào câu trả lời của bạn. –

0

Bạn có thể sử dụng một kịch bản Node.js đơn giản để đọc và cập nhật các bundleDependencies tài sản và chạy nó qua NPM vòng đời móc/script.

cấu trúc thư mục của tôi là:

  • scripts/update-bundle-dependencies.js
  • package.json

scripts/update-bundle-dependencies.js:

#!/usr/bin/env node 
const fs = require('fs'); 
const path = require('path');  
const pkgPath = path.resolve(__dirname, "../package.json"); 
const pkg = require(pkgPath); 
pkg.bundleDependencies = Object.keys(pkg.dependencies);  
const newPkgContents = JSON.stringify(pkg, null, 2);  
fs.writeFileSync(pkgPath, newPkgContents); 
console.log("Updated bundleDependencies"); 

Nếu bạn đang sử dụng phiên bản mới nhất của npm (> 4.0.0) , bạn có thể sử dụng prepublishOnly hoặc prepack kịch bản: https://docs.npmjs.com/misc/scripts

prepublishOnly: Chạy TRƯỚC gói được chuẩn bị và đóng gói, CHỈ trên NPM xuất bản. (Xem bên dưới.)

prepack: chạy TRƯỚC một tarball được đóng gói (trên gói NPM, NPM xuất bản, và khi cài đặt git phụ thuộc)

package.json:

{ 
    "scripts": { 
    "prepack": "npm run update-bundle-dependencies", 
    "update-bundle-dependencies": "node scripts/update-bundle-dependencies" 
    } 
} 

Bạn có thể kiểm tra tự nó bằng cách chạy npm run update-bundle-dependencies.

Hy vọng điều này sẽ hữu ích!