conda包管理更新 | 您所在的位置:网站首页 › conda 更新包 › conda包管理更新 |
基础用法使用 conda 作为包管理工具 虽然 conda 官网写到 conda 能为 Python, R, Ruby, Lua, Scala, Java, JavaScript, C/ C++, FORTRAN 这么多的语言提供包、依赖关系和环境的管理,但是目前最普及最常见的仍是使用 conda 作为 Python 的包管理工具。 所以,本文就要讲讲 conda 作为 C++ 包管理工具的一个使用方式。 conda env在了解 conda 如何为 C++ 提供包管理功能之前我们先了解一下几个小知识点。 -I -L以 gcc 为例,-I 告诉编译器头文件的搜索目录,-L 则是添加链接库的搜索目录,编译器会在对应的目录下搜索所需要的头文件或者库文件。 env 的目录结构conda create -n conda_example_env先创建一个 conda env,我们看下此时的 env 的目录结构: 只有一个 conda-meta 文件。 接下来我们安装一下 C++ 单元测试框架库 gtest。 conda activate conda_example_env conda install -c conda-forge gtest -y安装完成后,conda list 检查一下 : 再看一下 env 的目录结构发生了什么变化: 多了 include 和 lib 目录,里面分别放着 gtest 以及它所依赖的头文件和库文件。 CMake Project既然 conda 能方便地把我们需要的库下载到 conda env 中,那么我们如何方便地这些目录配置到项目中呢? 以 cmake 项目为例: if (NOT $ENV{CONDA_PREFIX} STREQUAL "") message(STATUS "CURRENT CONDA PREFIX: $ENV{CONDA_PREFIX}") include_directories($ENV{CONDA_PREFIX}/include) link_directories($ENV{CONDA_PREFIX}/lib) endif ()注:把以上代码添加到 cmake 项目根目录的 CMakeLists.txt 中,在编译目标 target 之前。 通过读取环境变量 CONDA_PREFIX ,获得当前 activate 的环境所在目录,再将对应的头文件目录和库文件目录导入到当前的 cmake 项目中。 完整的 CMakeLists.txt cmake_minimum_required(VERSION 3.23) project(cmake_conda_example) set(CMAKE_CXX_STANDARD 14) if (NOT $ENV{CONDA_PREFIX} STREQUAL "") message(STATUS "CURRENT CONDA PREFIX: $ENV{CONDA_PREFIX}") include_directories($ENV{CONDA_PREFIX}/include) link_directories($ENV{CONDA_PREFIX}/lib) endif () add_executable(cmake_conda_example main.cpp) target_link_libraries(cmake_conda_example gtest)完整的 main.cpp #include int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }以上例子使用的是开源的资源(conda-forge),如果是想要发布自己的动态库、二进制,又该怎么做呢? conda-build安装使用详见官方文档: Conda-build documentation 提供一个简单的使用 cmake 发布二进制工具的 conda-build 模板作为参考。 文件: - build.sh - meta.yaml - run.sh - src # 文件夹build.sh#!/bin/bash set -e mkdir tmp_build cd tmp_build cmake .. -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_BUILD_TYPE=Release make -j 4 make installmeta.ymlpackage: name: test_bin version: "0.0.1" source: path: ./src build: include_recipe: False arch: linux number: {{ environ.get('BUILD_NUMBER', 0) }} requirements: build: - make - cmakerun.sh#!/bin/bash set -e export CONDA_BLD_PATH=build if [ -d "build" ]; then rm -rf build fi mkdir build conda build .src在 src 目录中,包含一个 CMakeLists.txt 以及需要发布的二进制工具。 CMakeLists.txt cmake_minimum_required(VERSION 3.16) project(test_bin) install(PROGRAMS test_bin DESTINATION bin RENAME test_bin)二进制工具和 CMakeLists.txt 放在同一个目录下。 执行 --> sh run.sh,可得到二进制工具的 conda-package 。 本地 channel既然已经有了 conda-package,那么如何可以通过 conda 进行查询安装等操作呢? 详见官方文档: Creating custom channels — conda 23.1.0 documentation 创建本地 channelmkdir -p channel/dev注意:创建的是两层目录 索引 channelconda index channel/dev再根据想要支持的平台,创建对应的文件夹。 把二进制的 conda-package 放到对应的目录中,不要忘记更新索引: conda index channe/dev 配置 ~/.condarc为了方便使用,我们将 channel 配置到 ~/.condarc 中,简化操作。 custom_channels: dev: file:///mnt/www/channel注意:完整的 url 为:file:///mnt/www/channels + / + dev 这样在 conda 操作时附加上 -c dev 即可选择本地的 channel。 构建 conda channel 服务那么,如果要将本机的 conda channel 分享给其他人使用,又该怎么做呢?我们可以借助 nginx 来完成。 nginxnginxAdvanced Load Balancer, Web Server, & Reverse Proxy - NGINXHow To Install Nginx on Ubuntu 20.04 | DigitalOcean nginx 安装详见以上文章。nginx configsudo vim /etc/nginx/sites-available/conda_channelConda_channels 内容如下: server { listen 6868; root /path-to/channel; access_log /var/log/conda_channel.access; error_log /var/log/conda_channel.error; location /dev/ { autoindex on; } }根据实际信息修改 listen,root 的内容. 接下来将配置链接到 sites-enabled 目录下: cd /etc/nginx/sites-enabled sudo ln -s /etc/nginx/sites-available/conda_channel conda_channel启动 nginx sudo nginx如果已经启动,使用 sudo nginx -s reload 重新加载配置. 为 channel 添加用户名和密码Add usersudo sh -c "echo -n 'lindadou:' >> /etc/nginx/.htpasswd"一定要有 : 作为分隔符。 Add encrypt passwordsudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"参考 - How Do I Set A Username And Password For Nginx? - Restricting Access with HTTP Basic Authentication | NGINX Plus 修改配置server { listen 6868; root /path-to/channel; access_log /var/log/conda_channel.access; error_log /var/log/conda_channel.error; location /dev { try_files $uri $uri/ =404; auth_basic "Restricted Content"; auth_basic_user_file /etc/nginx/.htpasswd; } location /dev/linux-64/ { autoindex on; } }修改完配置后记得重启或 reload nginx。 更新 ~/.condarc custom_channels: dev: http://lindadou:"密码明文"@localhost:6868/其他: |
CopyRight 2018-2019 实验室设备网 版权所有 |