私有仓库搭建

目前市面上比较常见的私有仓库搭建方法为:

  • 通过 Sinopia 或 verdaccio 搭建(Sinopia 已经停止维护,verdaccio 是 Fork 自 Sinopia,基本上大同小异),其优点是搭建简单,不需要其他服务。
  • 通过 cnpm 搭建,需要数据库服务,后期也支持了 redis 缓存(当 redis 设置了密码,访问好像有些问题),目前用的人最多,cnpm 推荐的是用 docker 作为容器。
  • 基于github私有库来搭建npm私有库,搭建简单管理方便,只需要维护github私有库,不需要本地搭建服务器、数据库等。
    1. 但是需要在package.json设置private为true(为了保证不小心发布到npm官方库)
    2. 安装之后,想要更新,只能重新npm install xxx;
    3. 发布的时候不能使用npm的相关命令,比如npm version patch、npm publish;
    4. 有时候拉取都比较慢,有时容易失败

npm及私有npm的工作原理?

当我们使用npm install去安装一个模块时,会先检查node_modules目录中是否已经存在这个模块,如果没有便会向远程仓库查询。

npm提供了一个模块信息查询服务,通过访问

registry.npmjs.org/packaename/version

就可以查到某个发布在npm模块上的具体信息以及下载地址,下载并解压到本地完成安装。
在这里插入图片描述
那如果我们搭建了私有的npm
使用 npm install 命令安装包时,NPM 将首先检查是否可以从私有注册表获取所需的包。如果私有注册表配置为代理公共注册表,且包不存在于私有注册表中,它还可以从公共注册表中拉取包。
在这里插入图片描述

verdaccio

Verdaccio 是一个轻量级、易于配置的开源私有 NPM 仓库解决方案,非常适合用于内部团队的包管理。下面是使用 Verdaccio 搭建私有 NPM 仓库的步骤。

安装 Verdaccio

  1. 安装 Node.js
    确保你已经安装了 Node.js。Verdaccio 要求 Node.js 的版本至少是 10.x。

  2. 安装 Verdaccio
    使用 npm 安装 Verdaccio:

    npm install -g verdaccio
    
  3. 运行 Verdaccio
    安装完成后,运行 Verdaccio:

    verdaccio
    

    默认情况下,Verdaccio 会在 http://localhost:4873 上运行。
    在这里插入图片描述

配置 Verdaccio

  1. 配置文件
    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 中的 authpackages 部分来配置访问控制和权限:

      auth:htpasswd:file: ./htpasswdmax_users: 1000packages:'@*/*':access: $authenticatedpublish: $authenticatedproxy: npmjs'**':access: $authenticatedpublish: $authenticatedproxy: npmjs
      

      这样配置后,只有经过认证的用户才能访问和发布包。

使用 Verdaccio

  1. 添加用户
    如果你想要管理用户登录,可以通过命令行添加用户:

    npm adduser --registry http://localhost:4873
    

    这将创建一个用户,并将其信息存储在 Verdaccio 的用户数据库中。
    在这里插入图片描述

  2. 登录到私有注册表

    npm login --registry=http://your-private-registry-url/
    
  3. 发布包

    • 配置你的 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在这里插入图片描述

    • 使用 npm 发布包:

      npm publish
      // 更新版本
      npm version patch
      
    • 再次发布之前要先进行更新版本,否则会失败

           // 更新版本npm version patch
      
  4. 撤销

    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
    
  5. 安装包

    • 通过设置 .npmrc 文件

      //可以通过以下命令设置npm 的注册表地址
      npm set registry http://localhost:4872///临时使用不同的注册表:如果您只想临时更改注册表地址(例如,仅对当前的终端会话有效),您可以在安装包时指定注册表地址,而不是全局更改设置:npm install <package-name> --registry http://localhost:4872///还原默认的 npm 注册表地址:npm set registry https://registry.npmjs.org/
      

      这个命令用于快速设置 npm 配置项,如注册表的 URL。
      然后执行 npm install可以下载

    • 使用命令行参数指定 Verdaccio 的 URL 来安装包:

      npm install <package-name> --registry http://localhost:4873
      

优点与缺点

优点

  • 易于安装和配置:快速搭建,简单易用。
  • 轻量级:非常适合小团队和个人使用。
  • 支持插件:可以通过插件扩展功能。

缺点

  • 缩放性:对于非常大的企业或高负载环境,可能不够强大。
  • 高级特性缺乏:相比于一些商业解决方案,如 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_PORT3005,这通常用于指定应用监听的端口。
      # 当前登录 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 默认的网络类型,适用于同一宿主机上的容器间通信。

整体来看,这个 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 仓库的步骤:

  1. 环境要求

    • 需要 Node.js 环境,确保你的系统上已安装 Node.js。
    • 安装 MySQL 或其他数据库,因为 cnpmjs.org 需要数据库来存储数据。
  2. 安装 cnpmjs.org

    • 使用 npm 安装 cnpmjs.org
      npm install -g cnpmjs.org
      
  3. 配置数据库

    • cnpmjs.org 默认使用 SQLite,但对于生产环境,推荐使用 MySQL。
    • 创建一个 MySQL 数据库并配置到 cnpmjs.org 的配置文件中。可以从 cnpmjs.org 的 GitHub 仓库 下载默认的 config.js 文件,然后修改数据库设置部分。
  4. 启动服务

    • 启动 cnpmjs.org 服务:
      cnpmjs.org start --admins='admin:admin@example.com' --config=config.js
      
    • 其中 admins 是管理员账号的设置,可以根据实际情况调整。
  5. 使用 cnpm

    • 安装 cnpm(如果尚未安装):
      npm install -g cnpm --registry=https://registry.npmmirror.com
      
    • 配置 cnpm 使用你的私有仓库:
      cnpm set registry http://localhost:7001
      

发布和安装包

  • 发布包:使用 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 进行源代码管理的团队。以下是详细的步骤说明:

步骤概览

  1. 启用 GitHub Packages

    • GitHub Packages 通常默认在所有账户上启用。
  2. 创建或选择一个 GitHub 仓库

    • 使用一个现有的 GitHub 仓库或创建一个新仓库用于托管你的私有 NPM 包。
  3. 生成 Personal Access Token

    • 在 GitHub 上生成一个访问令牌(Personal Access Token, PAT),确保它包含对 Packages 的适当权限。
  4. 配置 NPM 使用 GitHub Packages

    • 在你的项目中配置 .npmrc 文件以使用 GitHub 的 NPM 仓库。
  5. 发布 NPM 包

    • 将你的 NPM 包发布到 GitHub Packages。
  6. 安装和使用包

    • 通过 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

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

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

相关文章

代码随想录--哈希表--两数之和

题目 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素不能使用两遍。 示例: 给定 nums [2, 7, 11, 15], t…

【JAVA SE】抽象类和接口

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;JAVA 个人主页&#xff1a;Celias blog~ 目录 引言 一、抽象类 1.1 抽象类的定义 1.2 抽象方法 1.3 抽象…

【vue实战项目】通用管理系统:作业列表

目录 目录 1.前言 2.后端API 3.前端API 4.组件 5.分页 6.封装组件 1.前言 本文是博主前端Vue实战系列中的一篇文章&#xff0c;本系列将会带大家一起从0开始一步步完整的做完一个小项目&#xff0c;让你找到Vue实战的技巧和感觉。 专栏地址&#xff1a; https://blog…

springboot 实现kafka多源配置

文章目录 背景核心配置自动化配置类注册生产者、消费者核心bean到spring配置spring.factoriesyml配置使用 源码仓库 背景 实际开发中&#xff0c;不同的topic可能来自不同的集群&#xff0c;所以就需要配置不同的kafka数据源&#xff0c;基于springboot自动配置的思想&#xf…

Centos 7下的VulFocus靶场搭建详细教程

一、靶场介绍 自带 Flag 功能&#xff1a;每次启动 flag 都会自动更新&#xff0c;明确漏洞是否利用成功。带有计分功能。兼容 Vulhub、Vulapps 中所有漏洞镜像。 二、下载安装 下载 VMware 软件下载 centos镜像 三、Docker知识 学习链接&#xff1a;https://www.runoob.c…

如何在路由器上安装代理服务:详细教程

如何在路由器上安装代理服务&#xff1a;详细教程 步骤一&#xff1a;通过漏洞进入路由器系统开启Telnet服务使用Telnet登录路由器系统查看系统信息和CPU信息步骤二&#xff1a;交叉编译MIPS程序 Go对MIPS的支持 安装TFTP Server使用BusyBox tftp传输文件在路由器系统中下载编译…

linux进程加载和启动过程分析

我们的源代码通过预处理,编译,汇编,链接后形成可执行文件,那么当我们在终端敲下指令$ ./a.out argv1 argv2 后,操作系统是怎么将我们的可执行文件加载并运行的呢? 首先知道,计算机的操作系统的启动程序是写死在硬件上的,每次计算机上电时,都将自动加载启动程序,之后…

四、.Net8对接Ollama实现文字翻译(.Net8+SemanticKernel+Ollama)本地运行自己的大模型

.Net8SemanticKernelOllama 一、Semantic Kernel官方定义SK能做什么&#xff1f; 二、基本使用1、普通对话2、使用插件实现文本翻译功能 三、IChatCompletionService、ITextGenerationService、ITextEmbeddingGenerationService 很多情况都有这样的需求&#xff0c;使用自有系统…

运筹学_5.动态规划

文章目录 引言5.1 动态规划的基本概念首先明确什么是多阶段决策问题 5.2 动态规划的最短路径问题贝尔曼最优化原理建立动态规划模型的步骤 5.3 动态规划的投资分配问题投资分配问题定义投资分配问题的数学模型 5.4 动态规划的背包问题背包问题定义背包问题数学模型 引言 动态规…

Java——二进制原码、反码和补码

一、简要介绍 原码、反码和补码只是三种二进制不同的表示形式&#xff0c;每个二进制数都有这三个形式。 1、原码 原码是将一个数的符号位和数值位分别表示的方法。 最高位为符号位&#xff0c;0表示正&#xff0c;1表示负&#xff0c;其余位表示数值的绝对值。 例如&…

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

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

智能售货机的小投入大回报创业机遇

智能售货机的小投入大回报创业机遇 在当今这个快速进化的数字时代&#xff0c;智能售货机作为零售领域的新秀&#xff0c;正以其独特的便捷性和创新性逐步重塑传统零售格局。24小时不间断服务与自动化管理的结合&#xff0c;大幅度削减人力成本&#xff0c;使得智能售货机成为…

电脑突然提示:“failed to load steamui.dll”是什么情况?分享几种解决steamui.dll丢失的方法

相信有一些用户正在面临一个叫做“failed to load steamui.dll”的问题&#xff0c;这种情况多半发生在试图运行某个程序时&#xff0c;系统会提示一条错误消息&#xff1a;“failed to load steamui.dll”。那么&#xff0c;为何steamui.dll文件会丢失&#xff0c;又应该如何解…

Linux 使用 yum安装 ELK服务,yum 安装elasticsearch和Kibana(未写完)

文章目录 环境准备ELK组件介绍安装Elasticsearch安装Kibana 丢弃下载ELK 服务安装包Elasticsearch安装 Tips:关闭elasticsearch https修改 es 启动内存 环境准备 ELK组件介绍 ElasticSearch &#xff1a; 是一个近实时&#xff08;NRT&#xff09;的分布式搜索和分析引擎&…

Unity + 雷达 粒子互动(待更新)

效果预览: 花海(带移动方向) VFX 实例 脚本示例 使用TouchScript,计算玩家是否移动,且计算移动方向 using System.Collections; using System.Collections.Generic; using TouchScript; using TouchScript.Pointers; using UnityEngine; using UnityEngine.VFX;public …

python中的while循环

没有循环时&#xff0c;想打印0-100之间的数字&#xff0c;则需要循环多次&#xff0c;例&#xff1a; print(0) print(1) print(2) print(3) ... print(99) 但是使用循环的话&#xff0c;就不会有那么麻烦 while 循环 while 这个单词有“在……时”的含义&#xff0c;whil…

AI智能分析技术与安防视频融合当前面临的困难与挑战

人工智能与安防视频的融合为现代安全领域带来了革命性的变化&#xff0c;提高了安全管理水平、降低了管理成本并为用户提供了更加便捷和高效的服务。随着技术的不断进步和应用场景的不断拓展&#xff0c;未来人工智能与安防的融合将展现出更加广阔的发展前景。然而&#xff0c;…

Linux 服务查询命令(包括 服务器、cpu、数据库、中间件)

Linux 服务查询命令&#xff08;包括 服务器、cpu、数据库、中间件&#xff09; Linux获取当前服务器ipLinux使用的是麒麟版本还是cenos版本Linux获取系统信息Linux查询nignx版本 Linux获取当前服务器ip hostname -ILinux使用的是麒麟版本还是cenos版本 这个文件通常包含有关L…

Vue进阶之Vue无代码可视化项目(三)

Vue无代码可视化项目 项目初始化store的使用DataSourceView.vuestores/counter.ts开发模式按钮store/editor.tsLayoutView.vue导航条安装图标iconpackage.jsonstore/debug.tssrc/components/AppNavigator.vueAppNavigator.ts:AppNavigator.vue:theme样式theme/reset.csstheme/v…

CRM系统主要是干什么?CRM系统主要功能和作用

什么是CRM 系统&#xff1f;CRM系统到底是干什么的&#xff1f;不同的企业人员该如何利用CRM去解决他们的问题等等&#xff0c;问题太多了&#xff0c;今天来为大家详细介绍。 干货满满&#xff0c;建议收藏&#xff01;&#xff01; 首先第一个问题&#xff0c;什么是CRM系统…