2014-10-16 39 views
22

Do https://github.com/npm/npm/issues/2943, npm sẽ không bao giờ hỗ trợ khả năng gói bí danh và cài đặt nhiều phiên bản của cùng một gói.cách cài đặt nhiều phiên bản gói bằng npm

Các giải pháp được đăng trên vấn đề github có thể hoạt động cho các mô-đun JS thuần, nhưng khi npm trở thành tiêu chuẩn cho quản lý gói frontend, các gói hiện bao gồm các nội dung khác nhau như CSS.

Có cách nào khác để cài đặt nhiều phiên bản của cùng một gói không?

Ý tưởng tốt nhất mà tôi đã đưa ra là "sao chép" một gói và xuất bản nó với một tên hơi khác.

Ví dụ, nếu bạn cần nhiều phiên bản của jquery, bạn có thể chỉ xuất bản gói gọi jquery-alias1, jquery-alias2, jquery-alias3 vv, và sau đó thiết lập các phiên bản thích hợp trong package.json của bạn.

Hoặc bạn có thể đặt tên cho gói theo số phiên bản của họ, ví dụ như jquery-1.11.x, jquery-2.1.x, vv ..

Cả hai cách tiếp cận có vẻ cẩu thả dù. Có cái nào tốt hơn không?

+0

Không phải là Bower tiêu chuẩn trong quản lý gói frontend có thể [dễ dàng làm được điều này] (http://stackoverflow.com/questions/16442012/ bower-install-2-versions-of-jquery). – laggingreflex

+0

Có bower có vẻ như một sự thay thế ở đây. Nó quá tệ không có vẻ là một giải pháp npm, như giới thiệu một hệ thống quản lý gói cho một nhóm lớn có thể khó khăn. Đặc biệt nếu bạn đã có cơ sở hạ tầng được thiết lập để hỗ trợ npm (ví dụ: máy chủ đăng ký riêng tư npm) – mark

Trả lời

4

Có vẻ như "JSPM" có thể chính xác là công cụ bạn đang tìm kiếm. JSPM xây dựng trên đầu trang của NPM nhưng cho phép bạn kéo các gói từ nhiều nguồn (github, npm, v.v.). Nó sử dụng bộ nạp mô-đun phổ quát System.js trên giao diện người dùng để tải các mô-đun và "sử dụng quản lý phiên bản phẳng để tải xuống các thư mục có phiên bản hậu tố" dễ dàng để giải thích.

jspm.io

Khi bạn cài đặt một gói với jspm bạn có thể bí danh gói với một tên cụ thể, bạn có thể sau require định cụ thể trong các module của bạn.

$ jspm install jquery 
... (status msgs) ... 
ok Installed jquery as github:components/[email protected]^2.1.4 (2.1.4) 

$ jspm install [email protected] 
... (status msgs) ... 
ok Installed jqueryOne as github:components/[email protected] (1.11.3) 

     github:components/jquery 1.11.3 2.1.4 

Sau đó, trong js của bạn, bạn có thể chỉ đơn giản là require(jquery) và/hoặc require(jqueryOne) khi cần thiết, cho phép bạn đi qua lại khi cần thiết.

Điều này cũng tương tự đối với bất kỳ gói nào bạn muốn sử dụng nhiều phiên bản.

1

Điều này là khá khó khăn để làm sạch, do cách thức hoạt động của npm, vì vậy tôi sẽ tránh cố gắng để làm điều đó trong sản xuất.

Tuy nhiên, để thử nghiệm tích hợp và các trường hợp sử dụng tương tự, tôi tạo ra một gói phần mềm được gọi là multidep, cho phép bạn cài đặt nhiều phiên bản của cùng một gói và require họ như vậy:

var multidepPackages = require('multidep')('test/multidep.json'); 

var jquery1 = multidepRequire('jquery', '1.11.3'); 
var jquery2 = multidepRequire('jquery', '2.1.4'); 
14

tôi muốn gửi vào đây để bất cứ ai như tôi đang sử dụng Yarn và đã hạ cánh tại đây. Đó là một nhiều hơn hoặc ít thả thay thế cho NPM có hỗ trợ răng cưa ra khỏi hộp:

yarn add [email protected] 
yarn add [email protected]:[email protected] 
then 

import FlatButton from 'material-ui/FlatButton'; // v0.x 
import Button from 'material-ui-next/Button'; // v1.x 

(tín dụng ví dụ đi vào https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601)

+0

Ồ, chính xác gói tôi đang làm việc, Cảm ơn bạn! –

0

NPM Phiên bản cài đặt (https://github.com/scott113341/npm-install-version) cũng là một lựa chọn. Về cơ bản, nó thực hiện một số giải pháp khác ở đây (nói về mặt kỹ thuật) nhưng khá đơn giản để sử dụng.Các mô-đun được cài đặt với số phiên bản (tham số lệnh @version chuẩn được sử dụng bởi NPM) được dự đoán được cài đặt trong thư mục con dưới node_modules với tên đó. Bạn cũng có thể kiểm soát thư mục đích cho mỗi mô-đun - đó là hữu ích với các hệ thống xây dựng.

đoạn mã Cách sử dụng từ GitHub Documents:

const niv = require('npm-install-version'); 
const benchmark = require('./some-benchmark-function.js'); 

niv.install('[email protected]'); 
// installs [email protected] to node_modules/[email protected]/ 

niv.install('[email protected]'); 
// installs [email protected] to node_modules/[email protected]/ 

const csjs_old = niv.require('[email protected]'); 
const csjs_new = niv.require('[email protected]'); 
// require the old and new versions of csjs 

benchmark([csjs_old, csjs_new], 'some-test-input'); 
// run our fake benchmark function on the old and new versions of csjs 
Các vấn đề liên quan