2017-04-13 56 views
1

我希望有一個庫或工具可以運行我的代碼,並告訴我需要哪個版本的Node才能運行它。也許會更好,它會提醒我可以更改以支持舊版本的代碼區域。我的庫支持哪種版本的Node?

在野外有這樣的東西嗎?

+0

我不認爲它存在,通常你可以使用package.json來鎖定節點引擎,而不用擔心不同版本支持什麼。恕我直言,選擇最近的LTS版本或使用polyfills如果發現丟失的東西。 – Gntem

+0

從幫助中心引用:***要求我們推薦或查找書籍,工具,軟件庫,教程或其他非本地資源的問題對於堆棧溢出而言是無關緊要的,因爲它們傾向於吸引自以爲是的答案和垃圾郵件。相反,請描述問題以及迄今爲止解決問題的方法。*** – jfriend00

+0

我構建了一個庫,並希望優化它以在更廣泛的環境中工作。我在網上搜索資源,並沒有找到任何,所以我問了這個問題。 – kequc

回答

0

我不確定這正是你在找什麼,但there is an existing package.json property called "engines"包開發人員可以指定他們需要什麼版本。不太難使用globsemver包通過所有的package.json文件,以尋找與「引擎」的要求,並編譯成一個對象:

{ 
    [version1]: [{ packageName, currentlySupported }, { ... }], 
    [version2]: [...], 
    ... 
} 

下面是一個腳本,將創建一個基本的例子爲你的對象:

npm install glob semver 

checkversions.js:

const glob = require('glob'); 
const path = require('path'); 
const semver = require('semver'); 
const currentVersion = process.version; 
const versions = {}; 

glob('node_modules/*/package.json', (err, files) => { 
    files.forEach((file) => { 
     const pkg = require(path.resolve(__dirname, file)); 
     // only check add package if it specifies "engines" 
     if (pkg.engines && pkg.engines.node) { 
      const reqdVersion = pkg.engines.node.replace(/\s+/g, ''); 
      // assume you are using a supported version 
      let currentlySupported = true; 
      // check if current node version satisfies package requirements 
      if (!semver.satisfies(currentVersion, reqdVersion)) { 
       currentlySupported = false; 
      } 

      if (!Array.isArray(versions[reqdVersion])) { 
       versions[reqdVersion] = []; 
      } 

      versions[reqdVersion].push({ 
       package: file.replace(/node_modules\/(.*)\/package.json/, '$1'), 
       currentlySupported, 
      }); 
     } 
    }); 
    console.log(versions); 
}); 

運行:

node checkversions.js