9

在我的package.json中,我有一个依赖项"protractor": "2.1.0"。该软件包又取决于"jasminewd2": "0.0.5".

jasminewd2软件包有一些我想修改的行为。我下载了它的源代码并进行了我需要的更改。Yarn 的文档讲述了使用本地资源包的可能性:

yarn add file:/path/to/local/folder安装本地文件系统上的软件包。这对于测试您尚未发布到注册表的其他包很有用。

当我执行该命令时

  1. "jasminewd2": "file:\\CustomNodeModules\\jasminewd2"被添加到我的package.json中。
  2. 这是我的yarn.lock文件:

    "file:\\CustomNodeModules\\jasminewd2", jasminewd2@0.0.5:
      name jasminewd2
      version "0.0.5"
      resolved "https://registry.yarnpkg.com/jasminewd2
         /-/jasminewd2-0.0.5.tgz#528609a124dfc688c1e3f434a638e047066cd63e"
    

因此,node_modules/jasminewd2包含来自 npm 存储库的原始版本。我怎样才能让纱线安装我的版本呢?

4

2 回答 2

7

我相信您的解决方案不起作用,因为jasminewd2它是传递依赖 (of protractor) 而不是直接依赖。所以当你直接添加它时,传递的不受影响。

您可以使用 3 种方法解决此问题:

  1. 如果您的更改是暂时的(用于开发或故障排除),您应该yarn link按照文档中的说明进行。
  2. 否则,您可以同时分叉protractorjasminewd2包并在各自package.json的 s. 中引用它们。package.jsons 的 语法"protractor": "<githubUser>/<githubRepo>".
  3. 使用yarn'resolutions 字段: "resolutions": { "jasminewd2": "desired-version-or-url-or-path" }。我知道 PNPM 也有一个等效的功能(但我自己没有使用过)。

根据我的经验,选项 2 和 3 以包管理器缓存的形式有一个警告:您的 git repo仅在首次安装HEAD该依赖项时才会被拉取。之后,它每次都会被缓存并重新安装 - 即使您的存储库已更改。HEAD

解决方法是引用提交哈希作为依赖项的一部分,如下所示"dependency": "user/repo.git#aef38fb2adc73304ae1ea87b0d607ad7fadc4d0g"

于 2016-11-04T07:34:37.153 回答
2

使用 postinstall 和 git 覆盖子模块

npm 方式”需要特定的提交(或版本/标签)才能从 git 存储库安装包,有关 npm install 的更多信息。我通常会创建一个自定义分支并推送它,所以我希望能够克隆一个自定义分支来测试特定功能或只留下 master 分支。

为了覆盖一个包,我使用了npm 的postinstall 钩子

postinstall我在 in 中添加了一个脚本package.json

"scripts": {
  "postinstall": "./postinstall.sh",
  "start": "node index.js"
},

然后我使用 bash 脚本 ( postinstall.sh) 删除包并从 github 克隆它们:

#!/bin/sh

function override_pkg {
  USER=$1
  REPO=$2
  DEST=$3

  rm -rf node_modules/$DEST

  echo "Overriding $DEST..."

  if [ -d custom_modules/$DEST ]; then
    cd custom_modules/$DEST
    git pull
    cd ../../
  else
    case $REPO in
      *:*)
      REPOBR=(${REPO//:/ })
      git clone -b ${REPOBR[1]} https://github.com/$USER/${REPOBR[0]}.git custom_modules/$DEST
      ;;
      *)
      git clone https://github.com/$USER/$REPO.git custom_modules/$DEST
      ;;
    esac
  fi

  npm install custom_modules/$DEST
}

# func       user    repo   branch dest
override_pkg johndoe myrepo:branch mynpmpackage

该脚本在custom_modules文件夹中克隆一个包,然后用于npm将本地包安装到node_modules. 后面的分支名称:是可选的。

在 OP 的情况下应该是这样的:

override_pkg johndoe jasminewd:jasminewd2 jasminewd2

然后纱线:

yarn

如果我在本地 git 存储库上进行一些本地更改,custom_modules\mypackageyarn会再次调用以重新覆盖 pacakge。

如果我更换机器并且我已经获得了自定义包的本地版本,那么调用yarn将从存储库中提取并覆盖 pacakge。

PS。npm install也可以,但yarn速度要快一些。

用于测试目的的多个环境

这是一个不同的想法,但有时我用它来测试不同的配置。也许人们会发现它很有用,或者如果有人知道这样做的工具或东西,请告诉我。

在本地,我为此创建了两个不同的文件夹node_modules

首先是原始模块:

yarn --modules-folder=original-modules

标志:

  • --modules-folder <path>而不是将模块安装到node_modules相对于 cwd 的文件夹中,而是在此处输出它们。

然后对于自定义的,我可以简单地复制original-modules一个克隆:

cp -r original-modules custom-modules

或者我可以使用 yarn 添加更多自定义模块:

yarn add <modulename> --no-lockfile --modules-folder=custom-modules

标志:

  • --no-lockfile不要读取或生成锁定文件

当我对custom-modules文件夹感到满意时,我可以使用NODE_PATH在这样的环境之间切换:

对于普通环境:

NODE_PATH=original-modules npm start

自定义环境:

NODE_PATH=custom-modules npm start

重要的是该node_modules文件夹不存在或覆盖将不起作用,本地node_modules文件夹的优先级高于NODE_PATH.

于 2016-11-11T18:46:29.773 回答