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

时间:2018-05-07 03:31:12

标签: node.js npm

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

我的问题是 - 有没有办法测试NPM发布的结果,而不是实际发布到NPM?

我在想这样的事情。假设我有一个包名为#34; 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中发布的任何内容都发布了tarball,可能没有足够的时间来进行全面测试。但也许如果我们在copy_test_stuff时复制所有测试文件(包括灯具等),它可能有用吗?

5 个答案:

答案 0 :(得分:8)

我会详细说明我发布的评论,(感谢Alexander Mills)。

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

创建反应的应用内

到目前为止,最流行的整合。让我给你一些上下文,他们正在使用lerna并且有多个需要在主要注册表(npmjs)上发布之前需要测试的包。我将quote here Dan Abramov解释他们使用custon注册表的原因。

script is self-explanatory但我要强调一些部分。

+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并作为最后一步运行测试。我不能过多地了解细节,因为我只是浅浅地看到它。但我知道它的作用。

Mozilla Neutrino

这是work in progress,但在此提及也很有意思。

+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正在执行,他们发布所有包。

Babel.js

我知道Babel.js一直在尝试对Babel 6进行烟雾测试并且plans to integrate a registry with Babel 7。我quote Henry Zhu early this year talking about babel-smoke-tests位于create-react-app的同一个帖子中。

该实验名为babel-smoke-testsbabel-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/

答案 1 :(得分:7)

我已经为这个问题创建了一个解决方案。这是项目: https://github.com/ORESoftware/r2g

README很好地解释了它,但简而言之它基本上使用npm pack来创建tarball,然后在另一个本地NPM项目中使用npm install --production /path/to/tarball.tgz来使用原始的NPM项目你想测试。

我还从下面的答案中找到了@Zoltan Kochan的想法,即npm pack项目X,然后将该tarball安装为项目X的依赖项(将项目链接到自身)。然后,您可以重新使用测试套件以其发布的形式测试项目本身。

优点至少有三倍 - 首先你不要让.npmignore中的某些任意设置使你发布的包丢失了你需要的文件。其次,您强迫自己将其作为另一个项目的依赖项进行测试,而不仅仅是在同一项目中直接测试项目。第三,您使用--production标记npm install来查看是否具有在生产环境中运行它所需的所有依赖项。

当您的库在Jenkins / Travis / Appveyor等上进行测试时,它通常采用版本控制格式,而不是NPM发布格式。这大部分都归结为.npmignore,而.npmignore忽略了你的项目。此外,有些人使用package.json中的"files"属性,使用“files”意味着您可能无法包含发布所需的文件。

答案 2 :(得分:4)

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

  1. 打包你的包(这是npm在发布之前做的)
  2. 将您的软件包安装在临时位置
  3. 将程序包链接到项目的node_modules
  4. 这使您基本上可以将包作为测试中的依赖项。所以在&#34; awesome-pkg&#34;的测试中,require('../lib')的内容你写require('awesome-pkg')

    我在所有pnpm repos中使用这个包已经好几个月了,它运行得很好。我还发布了一篇关于此软件包的文章,该文章解释了它可以捕获的所有不同错误:Never ever forget to install a dependency

答案 3 :(得分:3)

(2019年答案)

只需运行

npm pack

npm 6及更高版本中,这将显示要上传的文件,并在当前目录中创建一个tar球。

答案 4 :(得分:2)

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

转到模块的根目录并执行

npm install . -g