私有仓库搭建
目前市面上比较常见的私有仓库搭建方法为:
- 通过 Sinopia 或 verdaccio 搭建(Sinopia 已经停止维护,verdaccio 是 Fork 自 Sinopia,基本上大同小异),其优点是搭建简单,不需要其他服务。
- 通过 cnpm 搭建,需要数据库服务,后期也支持了 redis 缓存(当 redis 设置了密码,访问好像有些问题),目前用的人最多,cnpm 推荐的是用 docker 作为容器。
- 基于github私有库来搭建npm私有库,搭建简单管理方便,只需要维护github私有库,不需要本地搭建服务器、数据库等。
- 但是需要在package.json设置private为true(为了保证不小心发布到npm官方库)
- 安装之后,想要更新,只能重新npm install xxx;
- 发布的时候不能使用npm的相关命令,比如npm version patch、npm publish;
- 有时候拉取都比较慢,有时容易失败
npm及私有npm的工作原理?
当我们使用npm install去安装一个模块时,会先检查node_modules目录中是否已经存在这个模块,如果没有便会向远程仓库查询。
npm提供了一个模块信息查询服务,通过访问
registry.npmjs.org/packaename/version
就可以查到某个发布在npm模块上的具体信息以及下载地址,下载并解压到本地完成安装。
那如果我们搭建了私有的npm
使用 npm install 命令安装包时,NPM 将首先检查是否可以从私有注册表获取所需的包。如果私有注册表配置为代理公共注册表,且包不存在于私有注册表中,它还可以从公共注册表中拉取包。
verdaccio
Verdaccio 是一个轻量级、易于配置的开源私有 NPM 仓库解决方案,非常适合用于内部团队的包管理。下面是使用 Verdaccio 搭建私有 NPM 仓库的步骤。
安装 Verdaccio
-
安装 Node.js:
确保你已经安装了 Node.js。Verdaccio 要求 Node.js 的版本至少是 10.x。 -
安装 Verdaccio:
使用 npm 安装 Verdaccio:npm install -g verdaccio
-
运行 Verdaccio:
安装完成后,运行 Verdaccio:verdaccio
默认情况下,Verdaccio 会在
http://localhost:4873
上运行。
配置 Verdaccio
- 配置文件:
Verdaccio 会在首次运行时创建一个默认的配置文件~/.config/verdaccio/config.yaml
。你可以编辑这个文件来调整设置,如端口、权限、存储路径等。
文档: https://verdaccio.org/zh-cn/docs/configuration/-
全部配置
# #号后面是注释 # 所有包的缓存目录 storage: ./storage # 插件目录 plugins: ./plugins#开启web 服务,能够通过web 访问 web:# WebUI is enabled as default, if you want disable it, just uncomment this line#enable: falsetitle: Verdaccio #验证信息 auth:htpasswd:# 用户信息存储目录file: ./htpasswd# Maximum amount of users allowed to register, defaults to "+inf".# You can set this to -1 to disable registration.#max_users: 1000# a list of other known repositories we can talk to #公有仓库配置 uplinks:npmjs:url: https://registry.npmjs.org/packages:'@*/*':# scoped packagesaccess: $allpublish: $authenticated#代理 表示没有的仓库会去这个npmjs 里面去找 ,#npmjs 又指向 https://registry.npmjs.org/ ,就是上面的 uplinks 配置proxy: npmjs'**':# 三种身份,所有人,匿名用户,认证(登陆)用户# "$all", "$anonymous", "$authenticated"#是否可访问所需要的权限access: $all#发布package 的权限publish: $authenticated# 如果package 不存在,就向代理的上游服务发起请求proxy: npmjs# To use `npm audit` uncomment the following section middlewares:audit:enabled: true # 监听的端口,IP,重点,不配置这个,只能本机能访问 listen: 0.0.0.0:4873 # log settings logs:- {type: stdout, format: pretty, level: http}#- {type: file, path: verdaccio.log, level: info}
-
Verdaccio 允许你通过修改
config.yaml
中的auth
和packages
部分来配置访问控制和权限:auth:htpasswd:file: ./htpasswdmax_users: 1000packages:'@*/*':access: $authenticatedpublish: $authenticatedproxy: npmjs'**':access: $authenticatedpublish: $authenticatedproxy: npmjs
这样配置后,只有经过认证的用户才能访问和发布包。
-
使用 Verdaccio
-
添加用户:
如果你想要管理用户登录,可以通过命令行添加用户:npm adduser --registry http://localhost:4873
这将创建一个用户,并将其信息存储在 Verdaccio 的用户数据库中。
-
登录到私有注册表:
npm login --registry=http://your-private-registry-url/
-
发布包:
-
配置你的
package.json
中的publishConfig
字段指向 Verdaccio 的 URL:"publishConfig": {"registry": "http://localhost:4873" }
文档:https://docs.npmjs.com/cli/v8/using-npm/registry#how-can-i-prevent-my-package-from-being-published-in-the-official-registry
-
或者设置
.npmrc
文件
在 npm 中更改注册表地址有几种不同的方法,可以根据需求选择适合的方法:
1. 永久更改注册表地址
如果您希望所有的 npm 命令都默认使用特定的注册表,您可以通过 npm 配置来设置:```bashnpm config set registry https://example.com/```这将更新您的用户级 npm 配置文件(通常在用户主目录的 `.npmrc` 文件中)。2. **为单个项目设置注册表地址**如果只想为某个特定项目设置注册表地址,可以在项目根目录下创建或修改 `.npmrc` 文件,并添加以下内容:```bashregistry=https://example.com/```这样设置后,只有在该项目目录下运行的 npm 命令会使用这个注册表地址。
-
使用 npm 发布包:
npm publish // 更新版本 npm version patch
-
再次发布之前要先进行更新版本,否则会失败
// 更新版本npm version patch
-
-
撤销:
npm unpublish
命令用于从 npm 注册表中删除已发布的包。这个命令非常有用,但也应谨慎使用,因为它会影响到依赖该包的任何人或任何项目。以下是命令的格式和详细解释:格式:
npm unpublish [<@scope>/]<pkg>@<version>
解释:
-
<@scope>/
: 可选项。如果你的包是发布在一个作用域下(通常是组织或团队的命名空间),你需要包含这个作用域。作用域名称前面加上@
符号,并与包名通过/
分隔。 -
<pkg>
: 必需项。这是你想要取消发布的包的名称。 -
<version>
: 必需项。这是你想要取消发布的包的具体版本号。提供版本号是必须的,因为npm unpublish
默认不允许删除整个包,只能删除指定版本。
使用示例:
假设你有一个名为
example-package
的包,版本1.0.1
,并且这个包是在作用域@mycompany
下:npm unpublish @mycompany/example-package@1.0.1
如果你的包没有使用作用域,命令如下:
npm unpublish example-package@1.0.1
-
-
安装包:
- 使用命令行参数指定 Verdaccio 的 URL 来安装包:
npm install <package-name> --registry http://localhost:4873
- 使用命令行参数指定 Verdaccio 的 URL 来安装包:
优点与缺点
优点:
- 易于安装和配置:快速搭建,简单易用。
- 轻量级:非常适合小团队和个人使用。
- 支持插件:可以通过插件扩展功能。
缺点:
- 缩放性:对于非常大的企业或高负载环境,可能不够强大。
- 高级特性缺乏:相比于一些商业解决方案,如 Artifactory 或 Nexus,功能上可能有所欠缺。
Verdaccio 是一个非常实用的工具,对于希望快速搭建私有 NPM 仓库的小团队或个人开发者来说,它提供了一个成本低且维护简单的解决方案。
服务器Linux搭建NPM私有仓库-verdaccio
创建opt文件夹
liunx文件夹都有自己的用途,可以看这篇Linux 系统目录结构
mkdir opt
安装verdaccio
docker pull verdaccio/verdaccio
创建项目结构和文件
执行以下命令
mkdir -p opt/{plugins,config,storage}
生成以下目录结构
-opt-docker-compose.yml #docker-compose 配置文件-plugins -config-config.yaml #verdaccio 配置文件-storage
编辑 docker-compose 配置文件
version: '3.4'services:verdaccio:image: verdaccio/verdacciocontainer_name: "verdaccio"networks:- node-networkenvironment:# VERDACCIO 服务端口- VERDACCIO_PORT=3005# 当前登录 linux 服务器的用户名- VERDACCIO_USER_NAME="root" ports:# 宿主和容器的端口- "3005:3005"volumes:- "./storage:/verdaccio/storage"- "./config:/verdaccio/conf"- "./plugins:/verdaccio/plugins"
networks:node-network:driver: bridge
下面是对每一行配置的详细解释:
version: '3.4'
- 版本: 这一行指定了
docker-compose
文件使用的版本是3.4
。每个版本的docker-compose
支持特定的功能集合。
services:
- 服务: 开始定义一个或多个服务的部分,每个服务将对应一个容器。
verdaccio:
- verdaccio 服务: 这里定义了一个名为
verdaccio
的服务。
image: verdaccio/verdaccio
- 镜像: 为
verdaccio
服务指定使用verdaccio/verdaccio
镜像,这是一个预构建的 Docker 镜像,可从 Docker Hub 获取。
container_name: "verdaccio"
- 容器名称: 设置这个容器运行时的名称为 “verdaccio”。
networks:- node-network
- 网络: 将该服务连接到名为
node-network
的网络。
environment:
- 环境变量: 开始定义环境变量的部分。
# VERDACCIO 服务端口- VERDACCIO_PORT=3005
- 环境变量: 设置环境变量
VERDACCIO_PORT
为3005
,这通常用于指定应用监听的端口。
# 当前登录 linux 服务器的用户名- VERDACCIO_USER_NAME="root"
- 环境变量: 设置环境变量
VERDACCIO_USER_NAME
为 “root”,这可以用于应用中需要引用服务器用户的场景。
ports:# 宿主和容器的端口- "3005:3005"
- 端口映射: 将容器内的端口
3005
映射到宿主机的端口3005
上,使得外部可以通过宿主机的端口访问服务。
volumes:- "./storage:/verdaccio/storage"- "./config:/verdaccio/conf"- "./plugins:/verdaccio/plugins"
- 卷挂载:
./storage:/verdaccio/storage
:将宿主机上当前目录下的storage
目录挂载到容器的/verdaccio/storage
目录,用于数据持久化。./config:/verdaccio/conf
:将宿主机上当前目录下的config
目录挂载到容器的/verdaccio/conf
目录,用于配置文件的持久化。./plugins:/verdaccio/plugins
:将宿主机上当前目录下的plugins
目录挂载到容器的/verdaccio/plugins
目录,用于插件的持久化。
networks:node-network:driver: bridge
- 网络定义:
- node-network: 这里定义了一个名为
node-network
的网络。 - 驱动: 使用
bridge
驱动,这是 Docker 默认的网络类型,适用于同一宿主机上的容器间通信。
- node-network: 这里定义了一个名为
整体来看,这个 docker-compose.yml
文件配置了一个单服务的应用,使用了网络、环境变量、端口映射和卷挂载来确保 verdaccio
正常运行并且是配置化和持久化的。
编辑 verdaccio 配置文件
storage: /verdaccio/storage
auth:htpasswd:file: /verdaccio/conf/htpasswd
uplinks:npmjs:url: https://registry.npmjs.org/server2:url: https://registry.npm.taobao.org/
packages:'@*/*':access: $allpublish: $authenticatedproxy: npmjs server2'**':# 这里如果不设置在使用 npm i xxx、 npm publish 时将会提示包不存在,为了方便这里直接设置上如下两行access: $allpublish: $authenticatedproxy: npmjs
logs:- {type: stdout, format: pretty, level: http}
listen:# 这个端口务必对应上- 0.0.0.0:3005
启动容器
docker-compose up -d --build
在浏览器打开 服务器网址:端口(3005) 将会出现如下页面
可能的报错
npm版本太低
这个是因为本地npm 版本太低导致的, https://github.com/verdaccio/verdaccio/issues/3413
本地添加用户报错 500
查看日志
error--- the user hehe could not being added. Error: EACCES: permission denied, open '/verdaccio/conf/htpasswd'
是因为Verdaccio在容器中以非根用户(uid=10001)的身份运行,要授权
因为当前的目录结构为
-opt-docker-compose.yml #docker-compose 配置文件-plugins -config-config.yaml #verdaccio 配置文件-storage
所以先进入opt文件夹,从报错来看是/verdaccio/conf/htpasswd没有权限
因为./config:/verdaccio/conf:将宿主机上当前目录下的 config 目录挂载到容器的 /verdaccio/conf 目录,用于配置文件的持久化。
执行一下操作就可以解决
chown -R 10001:65533 ./config/
CNPM
要使用 cnpm
(中国国内镜像版本的 npm)来搭建私有 NPM 仓库,我们主要会使用到 cnpmjs.org
,这是一个开源的私有 NPM 服务解决方案,支持 npm 的所有功能。cnpm
本身主要是为了优化在中国大陆访问 npm 的速度,而 cnpmjs.org
提供了完整的私有库服务。
安装和配置 cnpmjs.org
下面是基于 cnpmjs.org
搭建私有 NPM 仓库的步骤:
-
环境要求
- 需要 Node.js 环境,确保你的系统上已安装 Node.js。
- 安装 MySQL 或其他数据库,因为
cnpmjs.org
需要数据库来存储数据。
-
安装
cnpmjs.org
- 使用 npm 安装
cnpmjs.org
:npm install -g cnpmjs.org
- 使用 npm 安装
-
配置数据库
cnpmjs.org
默认使用 SQLite,但对于生产环境,推荐使用 MySQL。- 创建一个 MySQL 数据库并配置到
cnpmjs.org
的配置文件中。可以从 cnpmjs.org 的 GitHub 仓库 下载默认的config.js
文件,然后修改数据库设置部分。
-
启动服务
- 启动
cnpmjs.org
服务:cnpmjs.org start --admins='admin:admin@example.com' --config=config.js
- 其中
admins
是管理员账号的设置,可以根据实际情况调整。
- 启动
-
使用 cnpm
- 安装 cnpm(如果尚未安装):
npm install -g cnpm --registry=https://registry.npmmirror.com
- 配置
cnpm
使用你的私有仓库:cnpm set registry http://localhost:7001
- 安装 cnpm(如果尚未安装):
发布和安装包
- 发布包:使用
cnpm publish
发布你的 npm 包。 - 安装包:使用
cnpm install <package-name>
来安装包。
优点与缺点
优点:
- 完全控制:私有部署意味着你拥有对仓库的完全控制。
- 扩展性:相比于简单的 Verdaccio,
cnpmjs.org
支持更多的定制和扩展功能。 - 适合中国用户:
cnpm
的设置和优化适合中国国内用户,网络连接更快、更稳定。
缺点:
- 维护成本:需要自行维护服务器和数据库。
- 配置复杂:相比直接使用 npm 或 Verdaccio,配置和管理稍显复杂。
- 资源消耗:相对于轻量级的方案,
cnpmjs.org
可能会占用更多的系统资源。
使用 cnpmjs.org
搭建私有 NPM 仓库是一种有效的方式,特别是对于需要高度定制化和控制的大型团队或企业。这种方法提供了良好的性能和可扩展性,但也需要相应的技术支持来维护和管理。
GitHub Packages
使用 GitHub Packages 创建私有 NPM 库允许你将 NPM 包直接存储在 GitHub 上,利用 GitHub 提供的版本控制和协作功能,以及包管理的便利性。这是一个集成度高、配置简单的方案,适合已经使用 GitHub 进行源代码管理的团队。以下是详细的步骤说明:
步骤概览
-
启用 GitHub Packages
- GitHub Packages 通常默认在所有账户上启用。
-
创建或选择一个 GitHub 仓库
- 使用一个现有的 GitHub 仓库或创建一个新仓库用于托管你的私有 NPM 包。
-
生成 Personal Access Token
- 在 GitHub 上生成一个访问令牌(Personal Access Token, PAT),确保它包含对 Packages 的适当权限。
-
配置 NPM 使用 GitHub Packages
- 在你的项目中配置
.npmrc
文件以使用 GitHub 的 NPM 仓库。
- 在你的项目中配置
-
发布 NPM 包
- 将你的 NPM 包发布到 GitHub Packages。
-
安装和使用包
- 通过 GitHub Packages 安装和使用你的 NPM 包。
详细步骤
1. 启用 GitHub Packages
- 此服务通常已为 GitHub 用户启用。如果未启用,你可能需要联系 GitHub 支持。
2. 创建或选择一个仓库
- 直接在 GitHub 上创建一个新的仓库或选择一个已有仓库。私有包必须存储在私有仓库中。
3. 生成 Personal Access Token
- 在 GitHub 网站上,点击你的头像 > Settings > Developer settings > Personal access tokens > Generate new token。
- 选择
write:packages
用于上传包,read:packages
用于下载包。确保也选择了repo
权限,这对私有仓库是必需的。
4. 配置 NPM 使用 GitHub Packages
- 在你的项目根目录下创建
.npmrc
文件,加入以下内容(替换OWNER
为你的 GitHub 用户名或组织名):registry=https://npm.pkg.github.com/OWNER
- 在你的用户主目录下的
.npmrc
文件中配置 PAT://npm.pkg.github.com/:_authToken=YOUR_TOKEN
5. 发布 NPM 包
- 修改你的
package.json
文件中的name
属性,以确保它是@owner/repo
形式,其中owner
是你的 GitHub 用户或组织名,repo
是仓库名。 - 确保你已登录到 NPM(使用命令
npm login
),然后运行:npm publish
6. 安装和使用包
- 确保
.npmrc
文件配置正确。然后你可以像使用其他 NPM 包一样安装和使用这些包:npm install @owner/package-name
优点与缺点
优点:
- 集成:紧密集成于 GitHub,简化了源代码和包管理的流程。
- 安全性:利用 GitHub 的安全设置,可以细粒度控制包的访问权限。
- 方便的版本控制和协作:利用 GitHub 强大的版本控制和协作特性。
缺点:
- 成本:对于私有仓库和私有包,需要 GitHub 的付费账户。
- 依赖性:依赖 GitHub 的在线服务,如果 GitHub 服务中断,可能会影响到包的访问。
- 配置和使用限制:虽然相对简单,但对于不熟悉 GitHub 的用户来说可能需要一定的学习曲线。
这些步骤总结了如何通过 GitHub Packages 设置和管理私有 NPM 库,希望对你的项目或团队有所帮
参考文档
https://verdaccio.org/zh-cn/docs/configuration/#storage
https://juejin.cn/post/7096701542408912933
https://auan.cn/internet/2010.html
https://juejin.cn/post/7063032346206797860
相关文章:

私有仓库搭建
目前市面上比较常见的私有仓库搭建方法为: 通过 Sinopia 或 verdaccio 搭建(Sinopia 已经停止维护,verdaccio 是 Fork 自 Sinopia,基本上大同小异),其优点是搭建简单,不需要其他服务。通过 cnp…...
axios设置 responseType为 “stream“流式获取后端数据
使用前景: 工作过程中遇到了后端接口响应过慢,前端界面一致loading的情况,这个时候可以尝试采用将Axios的responseType参数被设置为stream类型实现。 stream介绍: stream类型意味着你希望服务器响应的数据以Node.js流ÿ…...

Apache POI(使用Java读写Excel表格数据)
1.Apache POI简介 Apache POI是一个开源的Java库,用于操作Microsoft Office格式的文件。它支持各种Office文档的读写功能,包括Word文档、Excel电子表格、PowerPoint演示文稿、Outlook电子邮件等。Apache POI提供了一组API,使得Java开发者能够…...

golang中只用定义不用初始化的类型规律总结
在go语言的开发中,有很多的内置类型是我们只需要定义而不需要初始化的, 如上文中提到的bytes.Buffer, strings.Builder。 其实在go语言中官方给我们定义的很多的类型都只需要定义,不需要初始化。 他们都有2个共同的规律ÿ…...

数据库之PostgreSQL详解
一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议,这个协议基本和MIT开源协议一样,说人话,就是你可以对PostgreSQL进行一些封装&a…...

找出链表倒数第k个元素-链表题
LCR 140. 训练计划 II - 力扣(LeetCode) 快慢指针。快指针臂慢指针快cnt个元素到最后; class Solution { public:ListNode* trainingPlan(ListNode* head, int cnt) {struct ListNode* quick head;struct ListNode* slow head;for(int i …...

ssm629基于SSM的二手交易平台设计与开发+jsp【已测试】
前言:👩💻 计算机行业的同仁们,大家好!作为专注于Java领域多年的开发者,我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源: 👩💻 SpringBoot…...
【Unity】资源管理与热更 YooAsset+HybridCLR
1 前言 Unity资源管理与热更新该用什么方法?当然是YooAssetHybridCLR了,YooAsset负责资源管理与热更,HybridCLR负责支持代码热更。 但这里我就不自己讲了,我会提供相关学习链接(前人栽树我躺平)。 2 学习链…...

PDF批量加水印 与 去除水印实践
本文主要目标是尝试去除水印,但是为了准备测试数据,我们需要先准备好有水印的pdf测试文件。 注意:本文的去水印只针对文字悬浮图片悬浮两种特殊情况,即使是这两种情况也不代表一定都可以去除水印。 文章目录 批量添加透明图片水印…...

【MySQL】服务器配置和管理
本文使用的MySQL版本是8.0 MySQL服务器介绍 MySQL服务器通常说的是mysqld程序。 mysqld 是 MySQL 数据库服务器的核心程序,负责处理客户端的请求、管理数据库和执行数据库操作。管理员可以通过配置文件和各种工具来管理和监控 mysqld 服务器的运行 官方文档&…...
限流定义、算法、实施方案
限流定义 1、 时间 , 基于某段时间或某个时间点,即:时间窗口 2、资源: 对可用资源进行限制: QPS/连接数/传输速率/黑白名单等 分布式环境下,主流限流方案: 网关层限流:流量入口Ngi…...
[312. 戳气球] 动态规划寻找转移函数
Problem: 312. 戳气球 文章目录 思路Code 思路 这个哥们写的思路真的很牛逼,转载一下他。 戳气球题解 Code class Solution { public:int maxCoins(vector<int>& nums) {nums.insert(nums.begin(), 1);nums.push_back(1);int n nums.size();vector<v…...
以操作系统和Java的视角看“中断“
引言 fucking-java-concurrency主要解读了在开发过程中常常会遇到的Java并发问题,本文主要总结Java的中断原理和应用。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络,欢迎Star! 操作系统的中断 什么是中断࿱…...
【运维】如何在Ubuntu 22上使用Python 3.8的虚拟环境
在Ubuntu 22上使用Python 3.8的虚拟环境安装Ryu是相对简单的。以下是一步一步的指南: https://qq742971636.blog.csdn.net/article/details/139566151 安装Python 3.8: 在Ubuntu 22上,Python 3.8可能不是默认安装的版本。你可以使用以下命令…...

门面模式Api网关(SpringCloudGateway)
1. 前言 当前通过Eureka、Nacos解决了服务注册和服务发现问题,使用Spring Cloud LoadBalance解决了负载均衡的需求,同时借助OpenFeign实现了远程调用。然而,现有的微服务接口都直接对外暴露,容易被外部访问。为保障对外服务的安全…...

玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型
** 玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型 ** 目录 玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型 前言一、问题描述二、创建模型2.1 识别机构中的刚体2.2 确定刚…...
手撸一个java网关框架
手写一个简易的Java网关框架涉及到很多方面,但我会提供一个基本的框架概念和代码示例,帮助你理解网关的基本构建。以下是一个简单的Java网关框架的实现: 定义路由:需要一个路由表来映射请求的URL到对应的处理器。 请求处理&#x…...

亮数据代理IP助力高效数据采集
文章目录 📑前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 本篇采用的代理IP 四、零代码获取数据4.1 前置背景4.2 亮数据浏览器自动抓取数据4.3 使用步骤: 五、数据集5.1 免费样本5.2 定制数据集 🌤️个人小结 …...

VS2022,DLL1调用lib,lib调用DLL2
DLL1调用lib,lib调用DLL2 问题1:为什么在dll1中需要引入dll2的.lib文件 当你有一个工程(dll1)调用静态库(lib),而静态库(lib)又调用另一个DLL(dll2…...
Unity Mirror VR联机开发 房间篇
一、需求 在联机时通常有加入房间这个步骤,在mirror示例中也有相应的案例,但是那个比较复杂,我们做教育科普类不需要如此复杂,傻瓜式操作基本就可以了,所以我简化了步骤,省略了点击准备按钮这一步骤&#…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...

Axure零基础跟我学:展开与收回
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...