Trích dẫn @npm_support tại địa chỉ:
https://twitter.com/npm_support/status/968195526989512705
2/2 Nếu bạn muốn tránh các vấn đề liên quan đến cài đặt phụ thuộc, một tuyến đường là dành cho bạn để viết một wrapper đó là yêu cầu như một phụ thuộc thường xuyên, và để đảm bảo rằng nó có optionalDeps
(và cũng đảm bảo rằng trình bao bọc xác minh bạn có mọi thứ cần thiết để làm việc).
Nhưng IMHO nó trông giống như giải pháp thay vì giải quyết vấn đề thực.
Tôi có thể hiểu rằng npm muốn bảo tồn tính di động và tránh xử lý các đặc trưng nền tảng, nhưng nó phải được thực hiện và IMHO thực hiện điều này trong thời gian chạy không phải là tối ưu (đặc biệt nếu ai muốn tối ưu hóa kích thước mã).
Vì vậy, hôm nay tôi không có giải pháp tối ưu để chia sẻ mà là một cuộc thảo luận mở cho đề xuất.
Không thể "hỗ trợ phụ thuộc có điều kiện" trong npm?
Điều đầu tiên mà tôi nghĩ đến là thêm phần "ghi đè" sẽ thay đổi (+ thêm, -remove, = thay thế) các phần được phân tích cú pháp hiện tại.
Ví dụ:
dependencies: { "common-stuff": "*" } overrides: { "os: { linux: { dependencies: { "+best-linux-module" } } } }
Và tùy chọn khác được đề xuất bởi một nhà phát triển tôi biết, sẽ giới thiệu một cung cấp từ khóa, sau đó một số module có thể cung cấp cùng một ngữ nghĩa hơn sẽ được thỏa mãn bởi resolver (a la debian), nhưng nó tạo ra chi phí tương tự.
Tôi đang tìm cách tiếp cận chung không chỉ tập trung vào hỗ trợ hệ điều hành mà còn trên các hương vị khác của gói (tùy thuộc vào công cụ chẳng hạn).
Bạn có biết bất kỳ sự cố liên quan nào trong trình theo dõi NPM không? nếu không tôi đang xem xét để nộp một lỗi để được theo dõi tại địa chỉ:
https://github.com/npm/npm/issues?q=dependencies+conditional
Phản hồi hoan nghênh ý tưởng này.
Câu hỏi hay. Tôi biết có trường 'os' trong [package.json] (https://npmjs.org/doc/json.html), nhưng điều đó không cho phép bạn trao đổi các phụ thuộc dựa trên nền tảng hiện tại - nó chỉ khai báo những gói phần mềm được đưa vào danh sách trắng/danh sách cấm trên đó. Ví dụ, tài sản trong 'package.json' này: ' "os": [ "! Win32", "darwin"] ' có nghĩa là "gói này sẽ không chạy trong các cửa sổ nhưng sẽ chạy trên Mac".Thật không may, điều này không thực sự đạt được những gì bạn đang yêu cầu. – smithclay
^Đó chính xác là vấn đề, nếu mô đun dbus có các liên kết gốc sẽ chỉ biên dịch trên một hệ điều hành cụ thể ([như đã đề cập bên dưới trong chú thích] (http://stackoverflow.com/questions/15176082/npm-package-json- os-specific-dependency # comment22801812_15670089)), package.json của nó nên bao gồm trường 'os' đó. –