如何在不实际发布到 NPM 的情况下测试"npm 发布"结果?



我遇到的一个常见问题是,有时我的.npmignore 文件过于激进,我忽略了我实际上要包含在 NPM 压缩包中的文件。

我的问题是 - 有没有办法在不实际发布到 NPM 的情况下测试 NPM 发布的结果?

我在想这样的事情。假设我有一个包名称为"foo"的本地 NPM 包

set -e;
local proj="bar";
local path_to_foo="."
mkdir -p "$HOME/.local.npm"
npm --tarball -o "$HOME/.local.npm"  # made up command, but you get the idea
(
cd "$HOME/.temp_projects"
rm -rf "$proj"
mkdir "$proj"
cd "$proj"
npm init -f
npm install "$path_to_foo"
)
copy_test_stuff -o "$HOME/.temp_projects/bar"
cd "$HOME/.temp_projects/bar"
npm test

我认为这行不通。因为我们在 NPM 发布压缩包中包含的任何内容都可能不足以进行完整的测试。但是,如果我们在执行copy_test_stuff时复制所有测试文件(包括夹具等(,它可能会起作用?

只需运行

npm publish --dry-run

或者,在当前目录中生成压缩包

npm pack

npm 6及以上,这些将显示要上传的文件。

我会详细说明我发布的评论,(感谢亚历山大米尔斯(。

我是一个verdaccio贡献者,所以,我密切关注谁在实施以及如何verdaccio。我将描述我发现的夫妇或示例(主要是e2e(,这些例子可能很有趣或作为一个有效的答案。

创建反应应用程序

到目前为止,最受欢迎的集成。让我给你一些上下文,他们正在使用lerna并且有多个包需要测试,然后才能在主注册表(又名npmjs(上发布。我将在这里引用Dan Abramov解释他们使用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

如您所见,他们正在运行verdaccio,而是他们决定使用npm-cli-login的自定义配置文件,然后他们针对verdaccio运行测试。一切准备就绪后,他们在verdaccio上发布。最后一步,稍后在同一文件中,他们使用自己的应用程序获取包。

PNPM

他们创建了一个名为pnpm-registry-mock的项目,这是一个抽象,允许他们在运行测试之前运行verdaccio。

"pretest:e2e": "rimraf ../.tmp/ && rimraf node_modules/.bin/pnpm && pnpm-registry-mock prepare",
"test:e2e": "preview --skip-prepublishOnly && npm-run-all -p -r pnpm-registry-mock test:tap",
"test": "npm run lint && npm run tsc && npm run test:e2e", 

基本上,使用 npm 脚本,他们准备 verdaccio 并在最后一步运行测试。我不能太详细,因为我只是浅薄地看到它。但我知道它的作用。

莫斯拉中微子

这是正在进行的工作,但是,在这里提及也很有趣。

+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 进行烟雾测试,并计划将注册表与 Babel 7 集成。我引用亨利·朱(Henry Zhu(今年早些时候在同一条create-react-app线程中谈论babel-smoke-tests的话。

该实验称为 babel-smoke-tests,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嘲笑注册表对您来说可能是一个真正的选择。一些大型项目正在(或开始(使用它,它们或多或少遵循相同的方法。那么,为什么不尝试呢?:)

https://www.verdaccio.org/

我遇到了完全相同的问题,所以我创建了一个名为 package-preview 的包。包预览的作用是:

  1. 打包你的包(这是 npm 在发布之前所做的(
  2. 在临时位置安装包
  3. 将包链接到项目的node_modules

这允许您基本上要求包作为测试中的依赖项。所以在"真棒pkg"的测试中,你写require('../lib')require('awesome-pkg')

我在所有 pnpm 存储库中使用这个包几个月,效果非常好。我还发布了一篇关于这个包的文章,解释了它可以捕获的所有不同错误: 永远不要忘记安装依赖项

参考 npm 文档:

[--dry-run] 截至npm@6,除了发布之外的所有内容都会做什么吗? 实际发布到注册表。报告将要报告的详细信息 已经出版。

与 --dry-run 类似,请参阅 npm pack,它找出要包含的文件并将它们打包到一个压缩包中以上传到注册表。

https://docs.npmjs.com/cli/v6/commands/npm-publish#description

我看到太多复杂的答案,但根据文档,你只需要全局安装你的本地包(因为它将安装在不同的目录上(

转到模块根目录并执行

npm install . -g

最新更新