在 Nexus Repository Manager(OSS 或 Pro) 中对 C/C++ 项目进行制品归档 ,虽然 Nexus 本身不是为 C/C++ 原生设计的(不像 JFrog Artifactory 对 Conan 的深度支持),但通过合理使用其 Raw (raw) 仓库类型,完全可以实现清晰、可追溯、跨平台的制品管理。
以下是经过生产验证的合理方案 ,包含 目录结构设计、上传/下载操作、自动化集成建议。
✅ 一、核心原则
- 使用 Raw 仓库(不是 Maven/npm/Docker)
- 路径即元数据 :用文件路径表达 项目名、版本、操作系统、架构、编译器等关键信息
- 打包上传 :将库 + 头文件 + 配置文件打包为
.tar.gz,避免零散文件 - 版本语义化 :正式版用
v1.2.0,开发版用v1.2.0-dev-20260129-gitabc123
🗃️ 二、Nexus 仓库规划(Web 界面操作)
- 登录 Nexus → Repository → Create repository
- 选择 Recipe:
raw (hosted) - 创建以下仓库:
raw-cpp-releases:存放正式发布版本raw-cpp-snapshots:存放 CI 构建的开发版
- (可选)创建 Group 仓库
raw-cpp-public,聚合上述两个
🔒 权限设置:
- 上传账号(如
cpp-deployer):仅对*-releases/*-snapshots有 add/edit 权限- 下载账号(如
cpp-reader):对*-public有 read 权限
📁 三、制品存放路径规范(关键!)
推荐路径格式:
<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),欢迎继续提问!