【不起作用】限制前端項目安裝依賴的工具只能是:npm、yarn、pnpm中的一個

前言

安裝依賴的工具有好幾個,有時候我們在多個項目之間切換時,容易忘記,所以我們需要設置某個項目只能使用某一種依賴安裝工具

正文

方案一(不推薦)

本方案僅供提示作用,並不會強制限制
首先項目根目錄下新建一個 .npmrc 文件,內容爲:

engine-strict = true

然後修改項目的 package.json,增加:

{
    // 其他項略
    "engines": {
        "yarn": ">= 1.0.0" // 這個版本要求你也可以自己調整
    }
}

方案二(不起作用)

在package.json 中增加一個腳步

{
  scripts:{
        "preinstall": "node check-npm.js yarn",
  }
}

然後在根目錄下創建一個 check-npm.js 內容是:

const PACKAGE_MANAGER_LIST = ['npm', 'cnpm', 'yarn', 'pnpm']

// 獲取我們傳遞的參數<[npm|cnpm|yarn|pnpm]>
const argv = process.argv.slice(2)

// 沒有傳遞參數給與提示並終止運行
if(argv.length === 0) {
    const name = PACKAGE_MANAGER_LIST.join('|')
    console.log(`Please specify the wanted package manager: only-allow <${name}>`)
    process.exit(1)
}

// 我們傳遞的參數值<npm|cnpm|yarn|pnpm>
const wantedPM = argv[0]

// 亂傳參數給與提示並終止運行
if(!PACKAGE_MANAGER_LIST.includes(wantedPM)) {
    const name = PACKAGE_MANAGER_LIST.join(',')
    console.log(`"${wantedPM}" is not a valid package manager. Available package managers are: ${name}.`)
    process.exit(1)
}

// 當前使用的包管理器
const usedPM = getPackageManagerByUserAgent(process.env?.npm_config_user_agent).name

// 當前使用的包管理器和我們約束的不一樣 拋出一條錯誤日誌並終止運行
if(usedPM !== wantedPM) {
    console.error(`You are using ${usedPM} but wanted ${wantedPM}`)
    process.exit(1)
}

function getPackageManagerByUserAgent(userAgent) {
    if(!userAgent) {
        throw new Error(`'userAgent' arguments required`)
    }
    const spec = userAgent.split(' ')[0]
    const [name, version] = spec.split('/')

    return { name, version }
}

沒有搞定

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章