【问题标题】:Prevent Yarn install from running in project (i.e. force NPM install)防止 Yarn 安装在项目中运行(即强制 NPM 安装)
【发布时间】:2019-08-02 14:33:59
【问题描述】:

我们最近从 Yarn 切换回使用 NPM,但旧习惯很难改掉,我担心一些开发人员会不小心使用 yarn install

如何防止yarn install在项目中运行?或者,更好的是,显示使用npm install 的提醒?

我认为yarn install 可以被preinstall 脚本拦截,但我不确定在preinstall 脚本中查找什么。

【问题讨论】:

    标签: npm npm-install yarnpkg


    【解决方案1】:

    我想到了另一种选择,利用 Yarn 将在 package.json 中对照 $.engines.yarn 检查其版本这一事实。如果你这样设置:

    {
      ...
      "engines": {
        "yarn": "use npm!"
      }
    }
    

    Yarn 将退出,尽管有一个略显神秘的错误消息:

    yarn install v{foo}
    info No lockfile found.
    [1/5] ?  Validating package.json...
    error {bar}@{baz}: The engine "yarn" is incompatible with this module. Expected version "use npm!". Got "{foo}"
    error Found incompatible module
    info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
    

    【讨论】:

    • 虽然它很神秘,但我更喜欢这个解决方案,因为它很简单。
    • 您可以通过使用类似"\n\nUse NPM!\n\n" 的方式稍微提高错误消息的可读性。然后Use NPM通知在它自己的显眼行可见(可能需要\r\n来满足Windows,不知道)。
    【解决方案2】:

    您可以通过查看npm_execpath 环境变量的值来了解它是在运行Yarn 还是NPM。如果你做了类似的事情:

    "preinstall": "if [[ $npm_execpath =~ 'yarn' ]]; then echo 'Use NPM!' && exit 1; fi",
    

    然后yarn install(或只是yarn)会在安装步骤之前失败。如果你想让这个跨平台,或者你没有使用 *nix,那么你可以编写一个简单的脚本,例如:

    #! /usr/bin/env node
    
    if (process.env.npm_execpath.match(/yarn/)) {
      console.log("Use NPM!");
      process.exit(1);
    }
    

    然后在preinstall 中运行它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-25
      • 2019-07-11
      • 2020-06-14
      • 2017-04-25
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多