在gitlab上发布npm二进制文件

允许奇迹发生

大家好,我是「柒八九」。一个「专注于前端开发技术/RustAI应用知识分享」Coder

前言

还记得之前我们讲过如何在 npm 上发布二进制文件?吗。我们通过npm将我们之前在Rust 赋能前端-开发一款属于你的前端脚手架中生成Rust二进制文件发布到npm仓库中。

如果想体验上述功能,可以通过npm全局安装f_cli_f[1]在本地体验一下。

如果,你不想把自己的npm发布到公网上,那么我们还可以将我们的npm发布到公司内网上。这个我们在如何在gitlab上发布npm包介绍过了。

但是呢,在如何在gitlab上发布npm包中我们只是介绍了如何发布一个正常的npm,并且还不涉及各个包直接的关联。如果,我们想在gitlab发布二进制类型的包,同时还涉及多个包直接的交互呢,上面的方案就有点捉襟见肘了。

那么,我们今天就聊聊,如何在「gitlab发布npm二进制包」并且我们还会涉及npm包直接的互相操作。

好了,天不早了,干点正事哇。

alt

我们能所学到的知识点

  1. 项目结构
  2. 发布子包到gitlab 仓库
  3. 主包逻辑
  4. 全局安装并执行

1. 项目结构

我们采用和之前发布到npm的目录结构几乎一样。

alt

有四个包

  1. f_cli_windows_x64: f_cli 适配 Windows架构
  2. f_cli_darwin_x64: f_cli 适配 MACOS_Intel64架构
  3. f_cli_darwin_arm64: f_cli适配 MACOS_ARM64架构
  4. f_cli:主包,用户根据用户操作环境下载对应的二进制文件

2. 发布子包到 gitlab 仓库

子包有3个,分别针对我们常见的开发环境。其实它们的内容极其简单。这个和之前在如何在 npm 上发布二进制文件?中是一样的。

"f_cli_darwin_arm64"/"f_cli_darwin_x64"
 ├── package.json
 └── bin/
     └── f_cli

"f_cli_windows_x64"
 ├── package.json
 └── bin/
     └── f_cli.exe

bin文件中存放的就是我们脚手架编译后的二进制文件。

由于这三个子包的处理方式都出奇的一致。我们就随意挑选一个来讲解

创建.npmrc

在如何在gitlab上发布npm包讲过,如果要在gitlab发布npm私包,我们需要创建一个.npmrc

@<your-scoop>:registry=https://公司gitlab域名/api/v4/npm/
//公司gitlab域名/api/v4/projects/<your_project_id>/packages/npm/:_authToken=${AUTH_TOKEN}`

当然,我们还需要在gitlab中构建一个空项目,这步就省略了。

上面有几个参数我们需要变更

  1. <your-scoop>:这里设置我们的想要的名称,这里我们设置为 cli
  2. <your_project_id>:这是我们 demo项目在 gitlab的id,这个我们可以在 Settings->General->Project ID获取
    • alt
  3. AUTH_TOKEN我们使用环境变量来处理,这个变量在主页面的 Settings->Repository->Deploy tokens中设置 token
    • alt

别忘记,在生成token时,将值保存起来。

修改package.json

我们在package.json中还需要新增publishConfig,这是用于npm publish时用的。

{
  //...
  "publishConfig": {
    "@cli:registry""https://公司gitlab域名/api/v4/projects/project_ID/packages/npm/"
  }
}

发布包

最后,我们使用

AUTH_TOKEN=XXX npm publish

将本地的二进制包发布到了gitlab。可以看出,我们使用的手动发布的方式。是因为,我们这三个子包其实内部没啥逻辑,只是一个二进制文件,所以我们就选择了用「手动发布」的方式。

随后,我们就可以在demo项目中的Deploy->Package Registry中看到发布成功的包

alt

3. 主包逻辑

下面到了我们这篇文章的核心部分。

其实,主包的目录结构也很简单。

alt

新增.npmrc

还是一样的套路。

@<your-scoop>:registry=https://公司gitlab域名/api/v4/npm/
//公司gitlab域名/api/v4/projects/<your_project_id>/packages/npm/:_authToken=${AUTH_TOKEN}`

只不过需要将上面的信息,置换成主包的相关内容。

修改package.json

由于是主包,我们就需要额外的操作,这里就两点需要新增

  1. bin
  2. publishConfig
{
  "bin": {
    "front_cli""bin/cli"
  },
  "publishConfig": {
    "@cli:registry""https://gitlab.com/api/v4/projects/project_ID/packages/npm/"
  },
}

publishConfig就不用多说了,就是给npm发布用的。而bin中指定的信息就是,当此软件包「全局安装」时,该文件将链接到全局 bins 目录内,或者将创建一个 cmdWindows 命令文件)来执行 bin 字段中的指定文件,因此可用于由 namename.cmd(在 Windows PowerShell 上)运行。更过的可以参考package.json_bin[2]

当然,如果我们使用像nvm/fnmnode版本管理工具的话,也会在指定的地方进行配置。最终的结果就是,可以使得我们的包能够在全局访问并且执行对应的命令。

由于,我们本机使用的是fnm,然后在主包被全局安装后,在对应的node文件夹中就会新增对应的信息。

alt

bin/cli

这个和之前我们讲如何在 npm 上发布二进制文件?不同。

我们之前在package.json中还有

{
  "scripts": {
    "postinstall""node ./install.js"
  },
}

也就是在包被安装后,会自动触发postinstall命令,执行node ./install.js。里面就是根据各种平台信息和对应包的下载。

下面是之前install.js的主要逻辑。 alt

但是呢,我们从本地安装发布到gitlab的私包时,它不触发postinstall的命令,也就是在主包下载后,无法下载对应的子包。那意味着我们的这个功能直接垮掉。

所以,我们索性取消掉postinstall的逻辑,将下载和执行二进制的路径都迁入到bin/cli中。

alt

对比之前的install.js的逻辑,粗看下,其实没啥变化。主要流程还是根据process.platformprocess.arch确定平台和架构,然后从BINARY_DISTRIBUTION_PACKAGES查找对应的信息。

BINARY_DISTRIBUTION_PACKAGES

由于我们发布的位置和名称也发生变化。这里的BINARY_DISTRIBUTION_PACKAGES也有些许变更。

const BINARY_DISTRIBUTION_PACKAGES = {
  'darwin-x64''@cli/x64',
  'darwin-arm64''@cli/arm64',
  'win32-x64''@cli/windows_x64',
}

其实还有几点也发生了变化。之前我们是从npm中下载二进制包。由于我们在npm发布的公共包,也就意味着所有人都可以通过ajax进行获取。但是呢,我们现在也想通过ajaxnode项目中获取gitlab私包。这就需要提供额外的信息。

  1. projectID
  2. 授权信息

projectID被存放在了PROJECT_ID_MAP中。

const PROJECT_ID_MAP = {
  'darwin-x64''1',
  'darwin-arm64''2',
  'win32-x64''3',
}

然后,授权就是我们在进行异步接口时候,需要通过headerAuthorization字段提供。而这个字段的值就是之前我们申请的Deploy token(是不是让你保存了)。

我们之前提过,由于postinstall命令不好使,我们就把之前的install.jsbin/cli的逻辑合二为一了。

那就意味着现在bin/cli在被执行时,下载对应平台的二进制文件,并且根据参数执行命令。

downloadBinaryFromGitlab

alt

这里我们分了两种情况

  1. 首次全局安装,那就需要下载对应的二进制文件并执行
  2. 非首次安装,那就直接执行对应的二进制文件就行。

剩余的逻辑和之前是一样的。

makeRequest

这里也是一个重点。

alt

这里和之前的方法也有几点不同。

  1. 新增了 token参数
  2. https新增了 options
  3. 根据数据返回的多少,显示了下载进度信息

先看makeRequest如何被调用。

const tarballDownloadBuffer = await makeRequest(
    `https://公司gitlab域名/api/v4/projects/${projectID}/packages/npm/${platformSpecificPackageName}/-/${platformSpecificPackageName}-${BINARY_DISTRIBUTION_VERSION}.tgz`,
    "glpat-xxx"
  )

我们来简单解释一下,由于我们现在是从gitlab拉取私库,都说了是私库,那势必就有鉴权处理。 这里的token就是接收之前的Deploy Token

然后,将接收到的token放到httpsoptionsheaders中。

针对这点,我们可以从gitlab官网[3]查看。

针对进度信息的展示,也是很简单的逻辑,就是基于responsedata事件,每次跟新downloaded,并且用process.stdout.write输出到控制台。

发布主包

虽然,主包看起来逻辑比较多,但是在发布时,也是一句话搞定

AUTH_TOKEN=XXX npm publish

随后,我们就可以在gitlab中看到发布的包信息了。


4. 全局安装并执行

既然,我们已经将主包发布到了gitlab,那我们就需要使用其他方式将其下载到本地,然后执行对应的命令。

修改全局.npmrc

之前的文章讲过,如果想要下载gitlab的私包,那就需要修改本地.npmrc和全局.npmrc

因为,我们要全局安装,所以我们直接修改全局.npmrc

使用open ./.npmrc打开.npmrc并加入如下命令

@cli:registry=https://公司gitlab域名/api/v4/projects/projectId/packages/npm
//公司gitlab域名/api/v4/projects/projectId/packages/npm/:_authToken=glpat-xxxx

大家根据自己的实际情况修改上述内容。

全局安装

在全局安装之前,我们可以使用npm list -g来看看自己在特定node环境下,全局安装了啥。

然后,我们使用npm i @cli/cli -g来全局安装。由于我本地已经安装过了,这里就不贴图了。

我们可以使用npm list -g来查看是否安装成功,亦或者直接在控制台中输入front_cli命令。

反正,只有不是提示没对应的文件那就是安装成功了。然后,我们就可以开开心心的使用这个命令了。

完美完结🎉🎉🎉🎉


后记

「分享是一种态度」

「全文完,既然看到这里了,如果觉得不错,随手点个赞和“在看”吧。」

alt

Reference

[1]

f_cli_f: https://www.npmjs.com/package/f_cli_f

[2]

package.json_bin: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#bin

[3]

gitlab官网: https://docs.gitlab.com/ee/api/rest/#oauth-20-tokens

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生物制药企业选择谷歌云的理由有哪些?

AI发展的这一年&#xff0c;科学家也紧随其后&#xff0c;透过AI拓展更多微观层面的生物学奥义&#xff0c;包括蛋白质折叠等。生物制药公司也加大了在药物研发领域的投入&#xff0c;其中一方面就是搭载云平台。那么&#xff0c;生物制药公司选择谷歌云的原因有哪些呢&#xf…

Python | Leetcode Python题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution:def longestConsecutive(self, nums: List[int]) -> int:longest_streak 0num_set set(nums)for num in num_set:if num - 1 not in num_set:current_num numcurrent_streak 1while current_num 1 in num_set:curre…

Flutter基础 -- Dart 语言 -- 进阶使用

目录 1. 泛型 generics 1.1 泛型使用 1.2 泛型函数 1.3 构造函数泛型 1.4 泛型限制 2. 异步 async 2.1 异步回调 then 2.2 异步等待 await 2.3 异步返回值 3. 生成器 generate &#xff08;了解&#xff09; 3.1 同步生成器 sync* 使用 sync* 的场景 总结 3.2 异…

【C语言】编译与链接:深入理解程序构建过程

&#x1f525;引言 本篇将深入理解程序构建过程&#xff0c;以便于我们在编写程序的过程同时&#xff0c;理解底层是如何从程序的创建到生成可执行程序的。 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专…

软件设计师-知识点

系统总线 系统总线分为三部分&#xff1a; 数据总线地址总线控制总线 主要作用&#xff1a;用于CPU、主存和外设部件之间的连接 DMA控制器/中断控制器(CPU) DMA控制器和中断控制器(CPU)发出的数据地址&#xff1a;主存物理地址 释&#xff1a;和I/O设备相关的数据都是直接读…

c++与c

命名空间的设置&#xff1a; 避免冲突 命名空间&#xff1a; 如果将变量全部定义在全局可能不安全&#xff0c;都可以进行修改。 如果将变量定义在局部&#xff0c;当出了大括号就不能使用。 所以说在定义一个命名空间的时候 定义函数&#xff0c;变量&#xff0c;命名空间…

软件3班20240603

经典 报错 404 大概率 就是 这图 的 路径 写错i了 package com.yanyu;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jav…

现货白银的交易时间有多连贯?

国际市场上的现货白银优势很多&#xff0c;它除了具备国内同类型品种所不具备的数十倍资金杠杆外&#xff0c;也基本上实现了全天24小时不间断的交易时间&#xff0c;所以投资者可以在全天候连贯的行情中&#xff0c;寻找属于自己的交易获利机会。 但对于内地的投资者来说&…

从 Lerna 到现代化:原生 Workspaces 和 Changesets 的高效协作

1. 背景 最近新接手的一些 monorepo 的库项目&#xff0c;项目是用 lerna 进行管理的&#xff0c;使用过程中有一些不丝滑的地方&#xff0c;包括&#xff1a; lerna 版本过旧&#xff0c;使用 4.0.0&#xff08;现版本 8.1.3&#xff09;&#xff0c;功能差异过大&#xff0…

前端JS必用工具【js-tool-big-box】学习,检测密码强度

js-tool-big-box 前端工具库&#xff0c;实用的公共方法越来越多了&#xff0c;这一小节&#xff0c;我们带来的是检测密码强度。 我们在日常开发中&#xff0c;为了便于测试&#xff0c;自己总是想一个简单的密码&#xff0c;赶紧输入。但到了正式环境&#xff0c;我们都应该…

FullCalendar日历组件集成实战(8)

背景 有一些应用系统或应用功能&#xff0c;如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件&#xff0c;但功能比较简单&#xff0c;用来做数据展现勉强可用。但如果需要进行复杂的数据展示&#xff0c;以及互动操作如通过点击添加事件&#xff0…

【算法每日一练】新月轩就餐

思路&#xff1a; 其实很容易想到是双指针或者双端队列。 我们设置一个type表示当前区间已经有了多少种厨师&#xff0c;同时还需要记录区间中每个元素出现的次数&#xff0c;然后比较棘手的是移动问题了&#xff0c;什么时候移动呢&#xff1f; 我们可以发现当区间当队头元…

手眼标定学习笔记

目录 标定代码&#xff1a; 手眼标定原理学习 什么是手眼标定 手眼标定的目的 eye in hand eye to hand AXXB问题的求解 标定代码&#xff1a; GitHub - pumpkin-ws/HandEyeCalib 推荐博文&#xff1a; https://zhuanlan.zhihu.com/p/486592374 手眼标定原理学习 参…

国产操作系统上Vim的详解01--vim基础篇 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上Vim的详解01–vim基础篇 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上使用Vim的详解文章。Vim是一款功能强大且高度可定制的文本编辑器&#xff0c;广泛应用于编程和日常文本编辑中。…

记一次cms代码审计

000&#xff1a;前言 记录一次小型cms代码审计 001&#xff1a;任意文件删除 由于代码繁杂&#xff0c;不再一一展示 /app/controller/kindeditor.class.php 关键漏洞代码 public function delete() {$path ROOT_PATH.$_GET[pic];unlink($path);$flash M("flash&qu…

Postgre数据库初探

一、PostgreSQL介绍 PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES&#xff0c; 版本 4.2为基础的对象关系型数据库管理系统&#xff08;ORDBMS&#xff09;。POSTGRES 领先的许多概念在很久以后才出现在一些商业数据库系统中。 PostgreSQL是最初的伯克利代码的开…

vscode编译c/c++找不到jni.h文件

解决办法: 一、下载JDK 访问Oracle官网的Java下载页面&#xff1a;Java Downloads | Oracle 选择适合您操作系统的JDK版本&#xff1a; 对于Windows&#xff0c;选择“Windows x64”或“Windows x86”&#xff08;取决于您的系统是64位还是32位&#xff09;。对于Linux&#…

RPM包方式离线部署gitlab

下载安装包 要求&#xff1a;可以联网&#xff0c;系统及版本与目标服务器一致。配置gitlab yum仓库 curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash 新建包存放目录 mkdir /root/gitlab 下载gitlab及相关安装包 …

老赛棍版端口,扫别人没扫到的资产

0x001 获取目标信息 因为某些敏感原因&#xff0c;这部分干脆以长沙为例&#xff0c;仅做查询方式参考。首先FOFA搜&#xff1a;region"Hunan" && city"Changsha"&#xff0c;全部转换为C段后去重&#xff0c;就得到该城市的大致网段&#xff1a;…

Android O Camera深度研究

目录 Adnroid O之前的Android camera软件框架 Adnroid O camera软件框架 Passthrough Mode Binderized mode Wrapper shim for libhardware HALs Wrapper shim for libhardware HALs Customized Treble Camera HAL/framework Camera HAL transition and removal plan …