设置 Nexus npm :在仪表板上上传 tar 文件时出现空指针异常



在尝试上传简单的js捆绑包时,当我在nexus仪表板上查看记录器时,我收到以下错误堆栈跟踪:

2018-06-13 16:31:16,284-0400 ERROR [qtp139199987-18792] admin org.sonatype.nexus.extdirect.internal.ExtDirectServlet - Failed to invoke action method: coreui_Upload.doUpload, java-method: org.sonatype.nexus.coreui.UploadComponentComponent.doUpload
java.lang.NullPointerException: null
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:770)
at com.sonatype.nexus.repository.npm.internal.NpmPackageId.parse(NpmPackageId.java:129)
at com.sonatype.nexus.repository.npm.internal.NpmMetadataUtils.createRepositoryPath(NpmMetadataUtils.java:195)
at com.sonatype.nexus.repository.npm.NpmUploadHandler.lambda$0(NpmUploadHandler.java:84)
at org.sonatype.nexus.transaction.OperationPoint.proceed(OperationPoint.java:64)
at org.sonatype.nexus.transaction.TransactionalWrapper.proceedWithTransaction(TransactionalWrapper.java:56)
at org.sonatype.nexus.transaction.Operations.transactional(Operations.java:200).....

使用npm 设置 Nexus 时要采取的步骤:

配置

  1. 在此处下载 Nexus OSS
  2. 解压缩 tar 文件并启动 cd/NEXUS_FOLDER/nexus ./bin/nexus start
  3. 打开浏览器类型 http://localhost:8081/。登录(默认用户名=管理员/密码=管理员123(
  4. 单击设置 ->存储库
  5. ->创建存储库

*存储库如何工作: * 有三种类型的存储库:

  • 托管存储库 :由 nexus 托管的存储库。(您的内部库(。

      创建存储库 ->
    1. 选择 npm(托管( -> 输入名称 -> 允许重新部署 -> 创建存储库
  • 代理存储库 :在 npm 中,您无法从不同的存储库服务器下载软件包。因此,要下载公共 npm 包,您必须创建一个代理服务器。

    1. 创建存储库 -> 选择 npm(代理( -> 输入名称 -> 远程存储 -> 输入 http://registry.npmjs.org ->保存
  • 组存储库 :组存储库
  • 允许您将多个存储库和具有相同存储库格式的其他存储库组合并到单个存储库组中。然后,可以将此单个组和关联的 URL 用作来自多个存储库的特定格式的所有组件的单个访问点。

      创建存储库 ->
    1. 选择 npm(组( -> 成员存储库 -> 添加之前创建的两个存储库 -> 保存

    2. 设置 ->
    3. 在左侧菜单 -> 领域 -> 将 npm 持有者令牌领域添加到活动状态

将包推送到存储库

  1. 现在转到项目文件夹类型的根目录 npm init -> 创建包 json -> 输入名称/版本值

  2. 在项目文件夹类型根目录下的终端上:npm 设置注册表 http://localhost:8081/repository/[您的托管存储库名称]/

  3. npm adduser --registry=http://localhost:8081/repository/[your-hosted-repo-name].键入用户名/密码/电子邮件(默认:admin/admin123/[您的电子邮件](
  4. npm publish --registry http://localhost:8081/repository/[your-hosted-repo-name]。
  5. 现在,您可以在Nexus仪表板上的存储库下查看您的软件包。

拉动您的包裹

  1. 在项目文件夹的根目录下创建 .npmrc,值为 :

registry=http://ec2-34-229-205-247.compute-1.amazonaws.com:8082/repository/[your-nexus-group-repo-name]/

电子邮件=您的电子邮件

_auth=YWRtaW46YWRtaW4xMjM= (生成时间:$echo -n 'admin:admin123' | openssl base64(

  1. In package.json

    "依赖关系":{ "您的项目名称" : "1.0.0" }

  2. npm 安装

  3. 您现在可以在node_modules/下看到您的包裹

我被要求诊断这样的问题,最终发现正在加载的.tgz文件实际上根本不是.tar.gz(它是一个重命名的zip! 他们解析 package.json 的代码尝试在.tar.gz流中加载,但如果失败并且由于任何原因引发异常,它只会记录错误"处理 package.json 时出错,返回空映射以继续",然后返回空映射。 加载 package.json 后它做的第一件事是调用 createRepositoryPath,其中包含来自 json 的名称和版本(如果返回的映射为空,则为 null(,然后尝试从名称解析包 id(再次为 null(,然后检查它是否为 null(它是!(,因此它失败了。

因此,错误/损坏/错误格式的存档会导致此错误,因为它与您完全一样。 如果他们在解析时失败,这将是一个明显的错误,但他们只是返回一个空的地图,让失败来自未来的偶然事情......糟糕的设计。

最新更新