Node.js 如何测试“npm发布”结果,而不实际发布到npm?

Node.js 如何测试“npm发布”结果,而不实际发布到npm?,node.js,npm,Node.js,Npm,我有一个常见的问题,就是有时候我的.npmignore文件太过激进,我忽略了我实际上想要包含在NPM tarball中的文件 我的问题是-有没有一种方法可以测试NPM发布的结果,而不实际发布到NPM 我是这样想的。假设我有一个包名为“foo”的本地NPM包 我认为这行不通。因为无论我们在NPM发布tarball中包含什么,都可能没有足够的数据来进行完整的测试。但是,如果我们在复制测试内容时复制所有测试文件(包括夹具等),它可能会起作用。我会详细说明我之前发表的评论,(谢谢Alexander Mi

我有一个常见的问题,就是有时候我的.npmignore文件太过激进,我忽略了我实际上想要包含在NPM tarball中的文件

我的问题是-有没有一种方法可以测试NPM发布的结果,而不实际发布到NPM

我是这样想的。假设我有一个包名为“foo”的本地NPM包


我认为这行不通。因为无论我们在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
模拟注册表可能是一个真正的选择,它非常轻巧且易于使用。一些大型项目正在(或正在开始)使用它,它们或多或少遵循相同的方法。那么,为什么不试试呢?:)


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

  • 打包您的包(这是npm在发布之前所做的)
  • 在临时位置安装程序包
  • 将包链接到项目的节点模块
  • 这允许您在测试中基本上需要将包作为依赖项。因此,在“awesome-pkg”的测试中,在
    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