2017-11-22 66 views
8

Khi tôi tạo gói npm, đôi khi nó sẽ phải đối mặt với nhu cầu phiên bản gói phụ thuộc cũ cũ.Kiểm tra hai phiên bản gói npm khác nhau cùng lúc

Nếu phiên bản mới có api mới, tôi có thể viết mã trong mô hình này:

import pkg from 'some-pkg'; 
const isNewVersion = pkg.newVersionApi !== 'undefined'; 

if (isNewversion) { 
    pkg.newVersionApi(); 
} else { 
    pkg.oldVersionApi(); // backward compatible api 
} 

Và với mô hình này, khi tôi muốn viết bài kiểm tra, tôi chỉ có thể kiểm tra mã installed version. Không thể kiểm tra mã của phiên bản khác.

Ví dụ thực tế, trong React v15 và v16, React v16 có API Portal mới. Trước khi ra mắt Portal, v15 có unstable_renderSubtreeIntoContainer api để nhận ra tính năng tương tự.

Vì vậy, các mã cho Phản ứng sẽ như thế nào:

import ReactDOM from 'react-dom'; 
const isV16 = ReactDOM.createPortal !== 'undefined'; 

if (isV16) { 
    ReactDOM.createPortal(...); 
} else { 
    ReactDOM.unstable_renderSubtreeIntoContainer(...); 
} 

Vì vậy, tôi muốn hỏi là có phương pháp nào để thử nghiệm với different dependency version?

Hiện tại, một phương pháp mà tôi nghĩ là cài đặt lại phiên bản khác và kiểm tra nó. Nhưng nó chỉ có thể làm trên địa phương. Nó không thể làm việc trên ci và nó không thể đếm trong phạm vi bảo hiểm với nhau.

Tôi nghĩ rằng đó không chỉ là để kiểm tra phản ứng. Nó có thể phải đối mặt với thử nghiệm node.js. Bất kỳ đề xuất có thể được thảo luận.

Cập nhật

Câu hỏi này có lẽ có liên quan đến cài đặt two versions dependency trong NPM. Nhưng tôi biết hiện đang cài đặt hai phiên bản phụ thuộc là không khả thi.

+0

K.I.S.S. Nguyên tắc: Giải pháp nhanh nhất (và ít kỹ thuật nhất) ở đây là sử dụng hai bản sao riêng biệt của ứng dụng, mỗi bản có các phiên bản gói khác nhau mà bạn muốn thử nghiệm. Điều này là tầm thường để làm với 'git', vì bạn có thể 1) sao chép ứng dụng của bạn hai lần hoặc 2) sử dụng hai nhánh riêng biệt. –

+0

Đúng vậy. Sử dụng nhánh riêng biệt là một cách. Nhưng nếu đây là một nguồn mở hoặc một dự án hợp tác. Thật khó để kiểm soát vấn đề nhánh hợp nhất. Bởi vì chúng tôi cần phải nói với những người đóng góp theo dõi lộ trình thử nghiệm như cập nhật thay đổi của bạn trên cả hai nhánh và thử nghiệm nó. –

Trả lời

4

Đây có thể là giải pháp, không chắc chắn nó sẽ hoạt động như bạn mong đợi. Nhưng, bạn sẽ có một hướng để tiến lên phía trước.

gói.json

{ 
    "name": "express-demo", 
    "version": "0.0.0", 
    "private": true, 
    "scripts": { 
    "start": "node ./bin/www" 
    }, 
    "dependencies": { 
    "cookie-parser": "~1.4.3", 
    "debug": "~2.6.3", 
    "express": "~4.15.2", 
    "jade": "~1.11.0", 
    "morgan": "~1.8.1", 
    "serve-favicon": "~2.4.2", 
    "webpack": "^3.8.1", 
    "webpack-dev-middleware": "^1.12.0", 
    "webpack-hot-middleware": "^2.20.0" 
    }, 
    "customDependecies": { 
    "body-parser": [ 
     "", 
     "1.18.1", 
     "1.18.0" 
    ] 
    } 
} 

Note ở trên package.json tập tin, tôi đã thêm một khóa mới customDependecies mà tôi sẽ sử dụng để cài đặt nhiều phụ thuộc. Ở đây tôi đang sử dụng gói body-parser để giới thiệu. Tiếp theo bạn cần tập tin, có thể đọc này key và cài đặt các deps.

cài đặt-deps.js

const {spawnSync} = require('child_process'); 
const fs = require('fs'); 

const customDependencies = require('./package.json').customDependecies; 

spawnSync('mkdir', ['./node_modules/.tmp']); 

for (var dependency in customDependencies) { 
    customDependencies[dependency].forEach((version) => { 
    console.log(`Installing ${dependency}@${version}`); 
    if (version) { 
     spawnSync('npm', ['install', `${dependency}@${version}`]); 
     spawnSync('mv', [`./node_modules/${dependency}`, `./node_modules/.tmp/${dependency}@${version}`]); 
    } else { 
     spawnSync('npm', ['install', `${dependency}`]); 
     spawnSync('mv', [`./node_modules/${dependency}`, `./node_modules/.tmp/${dependency}`]); 
    } 
    }); 

    customDependencies[dependency].forEach((version) => { 
    console.log(`Moving ${dependency}@${version}`); 
    if (version) { 
     spawnSync('mv', [`./node_modules/.tmp/${dependency}@${version}`, `./node_modules/${dependency}@${version}`]); 
    } else { 
     spawnSync('mv', [`./node_modules/.tmp/${dependency}`, `./node_modules/${dependency}`]); 
    } 
    }); 
} 
spawnSync('rm', ['-rf', './node_modules/.tmp']); 
console.log(`Installing Deps finished.`); 

Ở đây, tôi đang cài đặt DEPS từng người một trong tmp thư mục và sau khi cài đặt, tôi đang di chuyển chúng đến ./node_modules thư mục.

Một lần, tất cả mọi thứ đã được cài đặt, bạn có thể kiểm tra các phiên bản như dưới đây

index.js

var bodyParser = require('body-parser/package.json'); 
var bodyParser1181 = require('[email protected]/package.json'); 
var bodyParser1182 = require('[email protected]/package.json'); 

console.log(bodyParser.version); 
console.log(bodyParser1181.version); 
console.log(bodyParser1182.version); 

Hope, điều này sẽ phục vụ mục đích của bạn.

+0

Tuyệt! Nó có vẻ thanh lịch hơn để giải quyết vấn đề kiểm tra. Bạn có bất kỳ ý tưởng nào để tính mức độ phù hợp với nhau không? –

+0

Tôi không chắc chắn, ý của bạn là gì khi "tính mức độ phù hợp với nhau?" –

+0

Vì phạm vi kiểm tra được tính dựa trên một quy trình thử nghiệm và khi tôi sử dụng cách này để cấu trúc dự án, tôi cần chạy quá trình thử nghiệm ở mỗi phiên bản khác nhau, mức độ phù hợp không thể tích hợp với nhau (ví dụ: kiểm tra v1 + v2 ...). –

0

Tạo 3 dự án riêng biệt (thư mục với package.json) và một thư mục chia sẻ:

  1. Một thư mục chia sẻ chứa các mô-đun thử nghiệm (my-test). Xuất một hàm để chạy thử nghiệm;
  2. Một dự án khách hàng nhập my-test và phụ thuộc v1. Xuất một hàm gọi hàm kiểm tra ở my-test.
  3. Một dự án khách hàng nhập my-test và phụ thuộc v2. Xuất một hàm gọi hàm kiểm tra ở my-test.
  4. Dự án chính nhập cả hai dự án khách hàng. Chạy từng chức năng được xuất.
0

Bạn sẽ phải chạy chúng một cách riêng biệt. Tạo một thư mục dự án riêng biệt cho mỗi phiên bản phụ thuộc. Ví dụ React10, React11, React12. Mỗi cái sẽ có package.json riêng, được chỉ định cho phiên bản chính xác. Khi bạn chạy các thử nghiệm integration và/hoặc versioned, bạn sẽ chạy các thử nghiệm đơn vị chuẩn trên mỗi phiên bản, nhưng cũng có thể được khuyến khích thêm bất kỳ thử nghiệm đơn vị cụ thể phiên bản nào vào thư mục đó.

Tạo tệp make sẽ giúp cuộc sống của bạn dễ dàng hơn khi chạy toàn bộ bộ thử nghiệm của bạn. Nếu bạn làm điều này bạn có thể dễ dàng tích hợp điều này vào CI.

+0

Đây là một giải pháp khả thi. Nhưng vì một chút khác biệt về thay đổi api, tôi có thể sao chép một số mã trong phiên bản khác. Bên cạnh đó, nó không thể đếm mã vùng phủ sóng với nhau. –

+0

Bạn sẽ sao chép mã nào? Bạn nên chạy các bài kiểm tra đơn vị giống nhau trên mỗi phiên bản. Ý tưởng để thêm các thử nghiệm bổ sung cho mỗi phiên bản, sẽ giúp bạn xóa chúng dễ dàng hơn khi phiên bản không còn được hỗ trợ và cho phép bạn kiểm tra điều gì đó chỉ xảy ra trên phiên bản đó. – Seth

Các vấn đề liên quan