用自己的实现替换npm包

时间:2016-11-03 10:11:56

标签: javascript npm yarnpkg

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

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

  

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"
    
  3. 因此,node_modules/jasminewd2包含npm存储库中的原始版本。如何让纱线安装我的版本?

2 个答案:

答案 0 :(得分:6)

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

您可以使用两种方法解决这个问题:

  1. 如果您的更改是暂时的(用于开发或故障排除),则应yarn link中所述protractor
  2. 否则,您可以分叉jasminewd2package.json个包,并在相应的package.json中引用它们。 "protractor": "<githubUser>/<githubRepo>" documentation HEADHEAD
  3. 根据我的经验,第二种方法有一个npm缓存形式的警告:只有当首次安装时才会撤消你的git repo&#39; "dependency": "user/repo.git#aef38fb2adc73304ae1ea87b0d607ad7fadc4d0g" 。之后,它会被缓存并且每次都会重新安装 - 即使您的回购邮件yarn已更改。

    这就是我通常将提交哈希作为依赖项的一部分引用的原因:{{1}}。我没有用{{1}}尝试这个技巧,但是假设它的行为完全相同(通过锁定文件设计)。

答案 1 :(得分:1)

使用postinstall和git

覆盖子模块

&#34; npm方式&#34;需要特定的提交(或版本/标记)来从git存储库more info on npm install安装包。我通常会创建一个自定义分支并继续推送,因此我希望能够克隆自定义分支以测试特定功能,或者只留下主人。

要覆盖包,我使用npm的postinstall hook挂钩。

我在postinstall中的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

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

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

PS。 npm install也有效,但yarn更快一些。

用于测试目的的多个环境

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

在本地我为node_modules创建两个不同的文件夹,如下所示:

首先是原始模块:

yarn --modules-folder=original-modules

标志:

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

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

cp -r original-modules custom-modules

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

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。< / p>