Node.js 如何测试“npm发布”结果,而不实际发布到npm?
我有一个常见的问题,就是有时候我的.npmignore文件太过激进,我忽略了我实际上想要包含在NPM tarball中的文件 我的问题是-有没有一种方法可以测试NPM发布的结果,而不实际发布到NPM 我是这样想的。假设我有一个包名为“foo”的本地NPM包Node.js 如何测试“npm发布”结果,而不实际发布到npm?,node.js,npm,Node.js,Npm,我有一个常见的问题,就是有时候我的.npmignore文件太过激进,我忽略了我实际上想要包含在NPM tarball中的文件 我的问题是-有没有一种方法可以测试NPM发布的结果,而不实际发布到NPM 我是这样想的。假设我有一个包名为“foo”的本地NPM包 我认为这行不通。因为无论我们在NPM发布tarball中包含什么,都可能没有足够的数据来进行完整的测试。但是,如果我们在复制测试内容时复制所有测试文件(包括夹具等),它可能会起作用。我会详细说明我之前发表的评论,(谢谢Alexander Mi
我认为这行不通。因为无论我们在NPM发布tarball中包含什么,都可能没有足够的数据来进行完整的测试。但是,如果我们在复制测试内容时复制所有测试文件(包括夹具等),它可能会起作用。我会详细说明我之前发表的评论,(谢谢Alexander Mills) 我是一名
verdaccio
贡献者,因此,我密切关注谁在实施verdaccio以及如何实施verdaccio。我将描述我发现的可能有趣或有效的夫妇或例子(主要是e2e)
创建react应用程序
到目前为止,最流行的集成。让我给你一些上下文,他们正在使用lerna
,并且有多个包需要在主注册表aka(npmjs
)上发布之前进行测试。我将解释他们使用custon注册表的原因
但让我强调一些部分
+nohup npx verdaccio@2.7.2 &>$tmp_registry_log &
+# Wait for `verdaccio` to boot
+grep -q 'http address' <(tail -f $tmp_registry_log)
+
+# Set registry to local registry
+npm set registry http://localhost:4873
+yarn config set registry http://localhost:4873
+
+# Login so we can publish packages
+npx npm-cli-login@0.0.10 -u user -p password -e user@example.com -r http://localhost:4873 --quotes
# Test local start command
yarn start --smoke-test
+./tasks/release.sh --yes --force-publish=* --skip-git --cd-version=prerelease --exact --npm-tag=latest
基本上,他们使用npm脚本准备verdaccio并作为最后一步运行测试。我不能过多地谈论细节,因为我只是浅尝辄止。但我知道它的作用
Mozilla中微子
这是,但是,在这里提到它也很有趣
+if [ "$PROJECT" == "all" ]; then
+ yarn link:all;
+ yarn validate:eslintrc;
+ yarn lint;
+ yarn build;
+ yarn test;
+else
+ yarn verdaccio --config verdaccio.yml & sleep 10;
+ yarn config set registry "http://localhost:4873";
+ npm config set registry "http://localhost:4873";
+ .scripts/npm-adduser.js;
+ yarn lerna publish \
+ --force-publish=* \
+ --skip-git \
+ --skip-npm \
+ --registry http://localhost:4873/ \
+ --yes \
+ --repo-version $(node_modules/.bin/semver -i patch $(npm view neutrino version));
+ yarn lerna exec npm publish --registry http://localhost:4873/;
+ PROJECT="$PROJECT" TEST_RUNNER="$TEST_RUNNER" LINTER="$LINTER" yarn test:create-project;
+fi
同样,同样的方法是,构建项目,然后执行verdaccio
,然后发布所有包
巴贝尔js
我知道Babel.js一直在尝试对Babel 6进行烟雾测试,并且已经成功了。我在创建react app
的同一线程中
这个实验被调用,babel smoke tests/scripts/test.sh
是您的关键文件
在这里,我看到了与其他项目相同的模式。他们正在启动verdaccio,然后他们开始做自己的事情
START=$(cd scripts; pwd)/section-start.sh
END=$(cd scripts; pwd)/section-end.sh
$START 'Setting up local npm registry' setup.npm.registry
node_modules/.bin/verdaccio -l localhost:4873 -c verdaccio.yml &
export NPM_CONFIG_REGISTRY=http://localhost:4873/
NPM_LOGIN=$(pwd)/scripts/npm-login.sh
$NPM_LOGIN
$END 'Done setting up local npm registry' setup.npm.registry
scripts/bootstrap.sh
export THEM=$(cd them; pwd)
if [[ $SPECIFIC_TEST ]]; then
scripts/tests/$SPECIFIC_TEST.sh
else
scripts/tests/jquery.sh
scripts/tests/react.sh
fi
收尾
首先,我希望我的小研究能为你解决问题提供新的思路。我认为npm-pack
解决了一些问题,但是使用verdaccio
模拟注册表可能是一个真正的选择,它非常轻巧且易于使用。一些大型项目正在(或正在开始)使用它,它们或多或少遵循相同的方法。那么,为什么不试试呢?:)
我遇到了完全相同的问题,所以我创建了一个名为的包。软件包预览的作用是:
require('../lib')
中,您编写require('awesome-pkg')
我在所有的pnpm回购协议中使用了这个包好几个月,效果非常好。我还发布了一篇关于此软件包的文章,解释了它可能捕获的所有不同错误:我看到了太多复杂的答案,但根据文档,您只需要全局安装本地软件包(因为它将安装在不同的目录中) 转到模块根目录并执行以下操作
npm install . -g
(2019年答案)
简单运行
npm pack
在
npm6
及更高版本中,这将显示将要上载的文件,并在当前目录中创建tar球。这是2012年发布的,但有一些信息:我不会做一个npm包,我会像Facebook在createreact应用程序上做的那样。他们将注册表模拟为verdaccio,发布并针对其他依赖项进行测试。这是一种可靠的方法,因为您可以轻松地测试整个工作流。Babel.js、pnpm和mozilla中微子也有同样的功能。我认为这是一个聪明的处理方法。@JuanPicado很酷,如果你可以把它作为一个答案而不是一个评论,可能会得到一些upvotesnice,这基本上就是我对r2g
所做的,除了我没有链接node\u modules文件夹。部分目的是测试安装后/预安装例程,因此您在欺骗您的人员!:)我希望我正在测试的任何包都能从main
导出一个名为r2gSmokeTest的函数,这个函数冒烟测试他们的包,他们必须实现它。再次阅读本文后,这是一个非常好的解决方案。然而,主要测试必须在require('x')
的地方编写,而不是require('..//x')
当然verdaccio听起来很酷,尽管我认为npm pack
应该足够了,模仿注册表可能更难,更容易出错,等等。npm pack
确实有效地探测了tarball的内容,但您无法证明解析依赖项和传递依赖项是否正常工作。这里是我用verdaccio做的一个演示(与我的答案相关),您可以发布一系列相互依赖的包(到localhost),并使用npm install
确保它们的DEP正常工作。verdaccio有很多dep,所以我在全球范围内安装了npmrc
,mkdir~/.npmrcs/verdaccio服务器&&(cd$&&npm init-y&&npm install--save verdaccio)
,以便在更改测试配置文件(npmrc test
)时可以启动服务器;很容易找到,但有点混乱,因为npmrc将verdaccio服务器列为npm配置文件rm-r.local/share/verdaccio/storage/
在测试后进行清理。这可以正常工作,但不考虑使用package.json中的files
关键字实现的白名单。我们还可以使用npm publish--dry run
来确定包含哪些文件,而不生成tarball。
npm install . -g
npm pack