在我的 package.json 中,我有一个依赖项"protractor": "2.1.0"
。该套餐又取决于"jasminewd2": "0.0.5"
。
jasminewd2
包有一些我想要修改的行为。我下载了它的源代码并进行了我需要的更改。 Yarn's documentation讲述了使用本地资源包的可能性:
yarn add file:/path/to/local/folder
安装本地文件系统上的软件包。这对于测试未发布到注册表的其他您的包非常有用。
当我执行该命令时
"jasminewd2": "file:\\CustomNodeModules\\jasminewd2"
已添加到我的 package.json 。这是我的 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存储库中的原始版本。如何让纱线安装我的版本?
答案 0 :(得分:6)
我相信您的解决方案不起作用,因为jasminewd2
是一个传递依赖(protractor
)而不是直接依赖。因此,当您直接添加时,传递的不受影响。
您可以使用两种方法解决这个问题:
yarn link
中所述protractor
。jasminewd2
和package.json
个包,并在相应的package.json
中引用它们。 "protractor": "<githubUser>/<githubRepo>"
documentation HEAD
为HEAD
。 根据我的经验,第二种方法有一个npm缓存形式的警告:只有当首次安装时才会撤消你的git repo&#39; "dependency": "user/repo.git#aef38fb2adc73304ae1ea87b0d607ad7fadc4d0g"
。之后,它会被缓存并且每次都会重新安装 - 即使您的回购邮件yarn
已更改。
这就是我通常将提交哈希作为依赖项的一部分引用的原因:{{1}}。我没有用{{1}}尝试这个技巧,但是假设它的行为完全相同(通过锁定文件设计)。
答案 1 :(得分:1)
&#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>