Nexus制品归档(c/c++项目)

Nexus Repository Manager(OSS 或 Pro) 中对 C/C++ 项目进行制品归档 ,虽然 Nexus 本身不是为 C/C++ 原生设计的(不像 JFrog Artifactory 对 Conan 的深度支持),但通过合理使用其 Raw (raw) 仓库类型,完全可以实现清晰、可追溯、跨平台的制品管理。

以下是经过生产验证的合理方案 ,包含 目录结构设计、上传/下载操作、自动化集成建议


✅ 一、核心原则

  1. 使用 Raw 仓库(不是 Maven/npm/Docker)
  2. 路径即元数据 :用文件路径表达 项目名、版本、操作系统、架构、编译器等关键信息
  3. 打包上传 :将库 + 头文件 + 配置文件打包为 .tar.gz,避免零散文件
  4. 版本语义化 :正式版用 v1.2.0,开发版用 v1.2.0-dev-20260129-gitabc123

🗃️ 二、Nexus 仓库规划(Web 界面操作)

  1. 登录 Nexus → RepositoryCreate repository
  2. 选择 Recipe: raw (hosted)
  3. 创建以下仓库:
    • raw-cpp-releases:存放正式发布版本
    • raw-cpp-snapshots:存放 CI 构建的开发版
  4. (可选)创建 Group 仓库 raw-cpp-public,聚合上述两个

🔒 权限设置:

  • 上传账号(如 cpp-deployer):仅对 *-releases / *-snapshotsadd/edit 权限
  • 下载账号(如 cpp-reader):对 *-publicread 权限

📁 三、制品存放路径规范(关键!)

推荐路径格式:

复制代码
<project>/<version>/<platform>/<artifact>

字段说明:

字段 示例 说明
project myengine, network-lib 项目唯一标识(小写、无空格)
version 1.2.0, 2.0.0-rc1, 1.2.0-dev-20260129-gitabc123 语义化版本 + 快照标识
platform linux-x86_64-gcc11, windows-x64-msvc142, macos-arm64-clang15 操作系统-架构-编译器(可简化)
artifact myengine-1.2.0-linux-x86_64.tar.gz 打包后的制品名

实际示例:

复制代码
myengine/1.2.0/linux-x86_64-gcc11/myengine-1.2.0-linux-x86_64.tar.gz
myengine/1.2.0/windows-x64-msvc142/myengine-1.2.0-windows-x64.zip
myapp/2.0.0/linux-aarch64/myapp-v2.0.0-aarch64.tar.gz
myengine/1.2.0-dev-20260129-gitabc123/linux-x86_64/myengine-dev.tar.gz

💡 为什么打包?

  • 减少 HTTP 请求次数
  • 保证原子性(要么全有,要么全无)
  • 包含 cmake/MyEngineConfig.cmake 等构建配置文件

🚀 四、如何上传制品?(操作指南)

方法 1:使用 curl(推荐,适合 CI/CD)

bash 复制代码
# 1. 打包制品(包含 lib, include, cmake 等)
tar -czf myengine-1.2.0-linux-x86_64.tar.gz \
    -C build/lib libmyengine.so \
    -C include myengine.h \
    -C cmake MyEngineConfig.cmake

# 2. 上传到 Nexus
curl -u cpp-deployer:your_password \
  --upload-file myengine-1.2.0-linux-x86_64.tar.gz \
  "http://nexus.yourcompany.com:8081/repository/raw-cpp-releases/myengine/1.2.0/linux-x86_64/myengine-1.2.0-linux-x86_64.tar.gz"

方法 2:在 CI/CD 中自动化(GitLab CI 示例)

复制代码
# .gitlab-ci.yml
variables:
  NEXUS_URL: "http://nexus:8081/repository/raw-cpp-snapshots"

deploy-snapshot:
  script:
    - export VERSION=1.2.0-dev-$(date +%Y%m%d)-$(git rev-parse --short HEAD)
    - export PLATFORM=linux-x86_64
    - tar -czf myengine-${VERSION}-${PLATFORM}.tar.gz libmyengine.so myengine.h
    - curl -u $NEXUS_USER:$NEXUS_PASS
        --upload-file myengine-${VERSION}-${PLATFORM}.tar.gz
        "${NEXUS_URL}/myengine/${VERSION}/${PLATFORM}/myengine-${VERSION}-${PLATFORM}.tar.gz"

🔽 五、下游项目如何下载使用?

方式 1:CMake 中自动下载(推荐)

创建 FetchMyEngine.cmake

复制代码
set(MYENGINE_VERSION "1.2.0")
set(MYENGINE_PLATFORM "linux-x86_64")
set(MYENGINE_URL "http://nexus:8081/repository/raw-cpp-public/myengine/${MYENGINE_VERSION}/${MYENGINE_PLATFORM}/myengine-${MYENGINE_VERSION}-${MYENGINE_PLATFORM}.tar.gz")

# 下载并解压
file(DOWNLOAD ${MYENGINE_URL} ${CMAKE_BINARY_DIR}/deps/myengine.tar.gz)
execute_process(
  COMMAND ${CMAKE_COMMAND} -E tar xzf myengine.tar.gz
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/deps
)

# 设置头文件和库路径
target_include_directories(myapp PRIVATE ${CMAKE_BINARY_DIR}/deps/include)
target_link_libraries(myapp ${CMAKE_BINARY_DIR}/deps/lib/libmyengine.so)

方式 2:Makefile / Shell 脚本

复制代码
DEPS_DIR := deps
VERSION := 1.2.0
PLATFORM := linux-x86_64
TAR_FILE := myengine-$(VERSION)-$(PLATFORM).tar.gz

$(DEPS_DIR)/lib/libmyengine.so:
    mkdir -p $(DEPS_DIR)
    curl -u user:pass -o $(DEPS_DIR)/$(TAR_FILE) \
        http://nexus:8081/repository/raw-cpp-public/myengine/$(VERSION)/$(PLATFORM)/$(TAR_FILE)
    tar -xzf $(DEPS_DIR)/$(TAR_FILE) -C $(DEPS_DIR)

🧼 六、维护与清理

1. 快照清理策略

  • raw-cpp-snapshots 设置 Cleanup Policy(Nexus Pro 支持)

  • 或定期运行脚本删除旧快照:

    复制代码
    # 删除 30 天前的快照
    find /opt/sonatype-work/nexus3/storage/raw-cpp-snapshots -name "*dev*" -mtime +30 -delete

2. 备份

只需备份:

复制代码
/opt/sonatype-work/nexus3/storage/raw-cpp-*

✅ 七、最佳实践总结

项目 建议
仓库类型 Raw (Hosted)
制品内容 .so/.a/.dll + .h + CMake Config 文件
打包格式 .tar.gz(Linux/macOS)、.zip(Windows)
路径规范 project/version/platform/artifact.tar.gz
上传方式 CI 中用 curl 上传压缩包
下载方式 CMake/Make 中用 curl + tar 获取
版本管理 语义化版本 + Git Commit ID(快照)
权限控制 分离 deployer / reader 账号

📦 附:制品包内部结构建议

复制代码
myengine-1.2.0-linux-x86_64.tar.gz
├── include/
│   └── myengine.h
├── lib/
│   └── libmyengine.so
└── cmake/
    └── MyEngineConfig.cmake   # 供 find_package() 使用

这样下游项目可通过标准 CMake 方式使用:

复制代码
find_package(MyEngine REQUIRED)
target_link_libraries(app MyEngine::MyEngine)

通过以上方案,你可以在 Nexus 中高效、规范地管理 C/C++ 制品,即使没有 Conan 或 Artifactory,也能实现企业级的制品归档与复用。

如需 具体脚本模板(CMake/Make/GitLab CI),欢迎继续提问!

相关推荐
j445566112 小时前
C++中的职责链模式实战
开发语言·c++·算法
m0_686041612 小时前
实时数据流处理
开发语言·c++·算法
梵刹古音2 小时前
【C语言】 字符型变量
c语言·开发语言·嵌入式
知无不研2 小时前
内存碎片与内存优化
开发语言·c++·内存优化·内存碎片·内存操作
m0_561359672 小时前
C++模块接口设计
开发语言·c++·算法
从此不归路2 小时前
Qt5 进阶【11】图形视图框架:用 QGraphicsView 搭一个流程图编辑器
开发语言·c++·qt
wengqidaifeng3 小时前
探索数据结构(二):空间复杂度
c语言·开发语言·数据结构
难得的我们3 小时前
单元测试在C++项目中的实践
开发语言·c++·算法
2301_790300963 小时前
C++中的命令模式
开发语言·c++·算法