Tùy chọn phụ thuộc trong npm?


23

Tôi có một câu hỏi tương tự như vậy , nhưng không hoàn toàn giống nhau.

Tôi muốn người dùng ứng dụng của tôi cài đặt nó với bất kỳ sự phụ thuộc nào là cần thiết cho cách anh ta muốn sử dụng nó. Vì vậy, ví dụ, nếu họ muốn tiếp tục MongoDB, thì chỉ các thư viện liên quan đến Mongo sẽ được cài đặt, nhưng nếu họ muốn tiếp tục với Redis, thì chỉ các thư viện liên quan đến Redis sẽ được cài đặt. Tôi không muốn làm cho họ tải xuống và cài đặt thư viện mà họ sẽ không sử dụng.

Tôi biết tôi có thể làm điều đó cho mục đích phát triển devDependencies, nhưng điều này còn đi xa hơn thế. Như câu trả lời trong câu hỏi trên cho biết, điều này liên quan chặt chẽ hơn với hồ sơ setuptools extras_requirecủa Python và Clojure leiningen. Bất cứ điều gì như thế trong npm? Tôi thực sự cảm thấy devDependenciesnên là một devhồ sơ của một cách linh hoạt hơn để xác định các phụ thuộc.


Chỉ cần một suy nghĩ nhưng bạn có thể đi với nhiều gói. MyPackage-Core MyPackage-Db-Mongo MyPackage-Db-Redisv.v ... rất nhiều cách họ làm các mô đun bower có nghĩa là để mở rộng angularjs .
Mike

@Mike: Hmm cảm ơn, tôi sẽ xem xét nó. Tôi vẫn nghĩ rằng đây là một hạn chế package.jsonđã được giải quyết trong các trình quản lý gói khác.
imiric

1
Đây là một câu hỏi hay, nhưng tôi nghĩ nó lạc đề vì nó là về việc sử dụng một số công cụ. Những câu hỏi như vậy chỉ có chủ đề nếu chúng bao gồm cách công cụ tích hợp vào một số quy trình phát triển - xét cho cùng, trang web này là về Kỹ thuật phần mềm. Xem trung tâm trợ giúp của chúng tôi để biết chi tiết. Xin vui lòng đọc: câu hỏi công cụ của tôi đi đâu? Việc sử dụng các công cụ phát triển như NPM sẽ là chủ đề trên Stack Overflow.
amon

Câu trả lời:


9

Các mô-đun Cùng phụ thuộc có thể là những gì bạn đang tìm kiếm, hoặc bất cứ điều gì mà làm điều gì đó tương tự như:

  • khai báo các phụ thuộc tùy chọn trong package.jsonđó không được cài đặt tự động bởi npm install, giả sửoptionalPeerDependencies
  • một requirechức năng kiểu tùy chỉnh biết optionalPeerDependenciesvà thực hiện đúng, bao gồm ném / cảnh báo khi không tìm thấy gì đáp ứng một lớp mô-đun cần thiết (ví dụ: không redis, cũng mongokhông mysql, v.v.) được cài đặt).
  • ghi lại sự mong đợi rằng người tiêu dùng của mô-đun này cài đặt ít nhất 1 trong các mô-đun ngang hàng tùy chọn

Một biến thể sẽ là nếu chức năng cốt lõi của mô-đun hoạt động mà không có bất kỳ phụ thuộc tùy chọn nào (ví dụ mẫu plugin), không có lỗi / cảnh báo khi không tìm thấy gì đáp ứng phụ thuộc ngang hàng.

Một biến thể khác là thực hiện danh sách trên trong khi tính toán cho sản xuất so với phụ thuộc phát triển, tức là tương tự cho dependenciesdevDependencies.

Có lẽ kết hợp với một yêu cầu theo yêu cầu sao cho các mô-đun tùy chọn được yêu cầu một cách lười biếng, ví dụ:

exports = {
    Core : require('./core'),
    get redis(){ return require('./redis'); },
    get mongo(){ return require('./mongo'); }
}

Tôi đã không cần điều này trong một thời gian, nhưng tôi nghĩ nó giải quyết được vấn đề mà tôi gặp phải. Cảm ơn!
imiric

2
Vâng, tôi nghĩ rằng nó đã được vài tháng tuổi mà bạn có thể đã tìm ra nó hoặc di chuyển trên. Tôi đã tìm thấy câu hỏi của bạn trong khi tự mình tìm kiếm câu trả lời vì vậy đây chủ yếu là cho hậu thế. Đã hơn một lần tôi đi tìm kiếm, chỉ để tìm câu trả lời từ chính tôi đã viết vài năm trước. Vì vậy, hãy xem xét lợi ích tự giác ngộ này. Ngoài ra, đã cập nhật câu trả lời để mô tả chung những gì codependencymô-đun cung cấp trong trường hợp mô-đun bốc hơi khỏi NPM và vì các liên kết không có đoạn trích là dạng SO xấu.
cụ 24/2/2015

9

Nếu bạn muốn các phụ thuộc tùy chọn đơn giản như plugin, ví dụ: nếu bạn cài đặt foo, bạn sẽ chạy nó nhiều màu sắc nhưng nếu không cài đặt, bạn không gặp vấn đề gì và thấy nó có màu xám, thì bạn có thể sử dụng tùy chọn trong gói.json :

{
  "name": "watchit",
  "version": "1.2.3",
  "optionalDependencies": {
    "foo": "^2.0.0"
  }
}

Và trong mã:

try {
  var foo = require('foo')
  var fooVersion = require('foo/package.json').version
} catch (er) {
  foo = null
}
if ( notGoodFooVersion(fooVersion) ) {
  foo = null
}

// .. then later in your program ..

if (foo) {
  foo.doFooThings()
}

Trích xuất từ tài liệu pack.json .


1

Những gì tôi làm là định cấu hình tập lệnh cài đặt trong gói.json của tôi, bên trong scripts, như thế này:

"install": "node ./my-tools/my-install.js",

Nó sẽ chạy ngay sau khi npm installkết thúc. Tôi sử dụng nó chủ yếu để tự động tạo một .envtập tin với mặc định.

Các my-install.jskịch bản có thể chạy các lệnh khác nhau, tạo ra tác phẩm, yêu cầu người dùng nhập vào, do đó bạn có thể nói "Muốn Redis hoặc Mongo?":

const exec = require('child_process').exec;
const readline = require('readline');

// Insert "Ask question script" here
// using readline core module

if ( option == 'mongo' )
  exec('npm install mongoose');

if ( option == 'redis' )
  exec('npm install redis');

Đây là một câu trả lời rất nhanh chóng, hãy kiểm tra readline để đọc đầu vào sử dụng đúng cách và quá trình con để chạy lệnh và xử lý kết quả, vv

Cũng lưu ý rằng tập lệnh cài đặt có thể là bất cứ điều gì bạn muốn (python, bash, v.v.)


2
Yêu cầu đầu vào của người dùng sẽ làm hỏng các bản dựng tự động. Chạy npm installlại bên trong tập lệnh cài đặt cũng có thể kích hoạt hành vi ngoài ý muốn. Tôi không đề xuất giải pháp này.
Tiên nữ Lambda

1

npm thực sự không được thiết kế cho việc này, vì một trong những phần khó nhất của quản lý phụ thuộc là đảm bảo các bản dựng nhanh, có thể tái tạo dễ dàng và tương đối không an toàn. Nhưng tôi tin rằng có một trường hợp sử dụng, và chắc chắn là có cho tôi. Vì vậy, tôi đã viết một gói để làm chính xác những gì bạn đang yêu cầu.

Gói của tôi là install-subsetvà có thể được cài đặt trên toàn cầu vớinpm install -g install-subset

https://www.npmjs.com/package/install-subset

Đầu tiên, bạn xây dựng danh sách trắng và danh sách đen cho các tập hợp con cài đặt có tên trong gói.json của bạn như thế này:

"subsets": {
    "build": {
        "whitelist": [
            "babel-cli",
            "dotenv"
        ]
    },
    "test": {
        "blacklist": [
            "eslint",
            "lint-rules",
            "prettier"
        ]
    }
}

Sau đó gọi nó với, ví dụ, install-subset test

Điều này sẽ tạm thời viết lại gói.json của bạn để không cài đặt các gói đó vào danh sách đen, sau đó khôi phục nó, tùy thuộc vào các gói có thể tiết kiệm rất nhiều thời gian và băng thông.

Cũng hoạt động với sợi, là nguồn mở và các vấn đề / PR được chào đón.

Trong nhiều trường hợp, tôi sử dụng điều này trên máy chủ ci của chúng tôi để giảm thời gian xây dựng và trong dự án React Native mới nhất của chúng tôi, đã cài đặt nhà phát triển mới điển hình của chúng tôi từ 72 giây xuống còn khoảng 20 giây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.