---
tags: c++, conan, package manager, visual studio
---
# Conan, C/C++ Open Source Package Manager
### https://conan.io/
<!-- .slide: data-transition="fade-out" -->
---

<!-- .slide: data-transition="fade-out" -->
---

<!-- .slide: data-transition="fade-out" -->
---
## 先講古
<!-- .slide: data-transition="fade-out" -->
---
## C/C++ libraries
* header files
* static/dynamic link binaries
<!-- .slide: data-transition="fade-out" -->
---
## C/C++ libraries
```bash
├── include
├── src
└── lib
```
<!-- .slide: data-transition="fade-out" -->
---
## 還好網路上充斥 XXX lib 設定教學
<!-- .slide: data-transition="fade-out" -->
---
## 萬一沒設定好...
* 找不到include -> compile error
* 找不到lib -> link error
<!-- .slide: data-transition="fade-out" -->
---
## Windows更慘
* 用哪一版vc build出來的exe就必須link到哪一版的build的lib
* Visual C++ ABI compatibility到2015年後才比較好 (vc140、vc141、vc142彼此兼容)
<!-- .slide: data-transition="fade-out" -->
---
## 許多library只提供src
<!-- .slide: data-transition="fade-out" -->
---
## 根據自己的需求build
```
├── 1.0
├── 1.1
└── 1.2
├───x64
└───x86
├───static
└───dynamic
├───debug
└───release
```
<!-- .slide: data-transition="fade-out" -->
---
## 時間成本
* 研究怎麼build
* 等待漫長的build lib過程
* 修link error
<!-- .slide: data-transition="fade-out" -->
---
## 共同開發時, 如何分享library
1. 自行安裝library, 必須安裝在相同的路徑下
2. 把需要用到的library放在git上再用submodule管理
<!-- .slide: data-transition="fade-out" -->
---
## 缺點
1. 自行安裝容易出錯, build不過
2. 需要多版本共存時不易管理
3. git對於大檔案管理的缺陷
4. 無法只下載特定版本的library, 除非你一個版本一個repo
<!-- .slide: data-transition="fade-out" -->
---

<!-- .slide: data-transition="fade-out" -->
---

<!-- .slide: data-transition="fade-out" -->
---
### https://conan.io/

<!-- .slide: data-transition="fade-out" -->
---
## 安裝
### python 2.7、3.5~3.7
`$ pip install conan`
### OSX
`$ brew install conan`
<!-- .slide: data-transition="fade-out" -->
---
## 以Windows Visual Studio為例
<!-- .slide: data-transition="fade-out" -->
---
```
$ conan search boost --remote=conan-center
Existing package recipes:
boost/1.66.0@conan/stable
boost/1.67.0@conan/stable
boost/1.68.0@conan/stable
boost/1.69.0@conan/stable
boost/1.70.0
boost/1.70.0@conan/stable
boost/1.71.0
boost/1.71.0@conan/stable
boost/1.72.0
```
<!-- .slide: data-transition="fade-out" -->
---
## search的陷阱
* 目前只有 case-sensitive search, 沒辦法改成case-insensitive
* 需要fuzzy search的時候需要自己加上 *, 例如boo\*
<!-- .slide: data-transition="fade-out" -->
---
conanfile.txt
```
[requires]
boost/1.66.0@conan/stable
[generators]
visual_studio
```
<!-- .slide: data-transition="fade-out" -->
---

<!-- .slide: data-transition="fade-out" -->
---

<!-- .slide: data-transition="fade-out" -->
---
## Build !
<!-- .slide: data-transition="fade-out" -->
---

<!-- .slide: data-transition="fade-out" -->
---
## 參考文件

<!-- .slide: data-transition="fade-out" -->
---
remotes.json
```
{
"remotes": [
{
"name": "conan-center",
"url": "https://conan.bintray.com",
"verify_ssl": true
}
]
}
```
<!-- .slide: data-transition="fade-out" -->
---
## 新增conan server
```
$ conan_server
$ conan remote add myremote https://localhost:9300
```
<!-- .slide: data-transition="fade-out" -->
---
## 比較
* conan, 根據conanfile.txt的內容, 只下載header和lib, 安裝到home目錄下
* vcpkg, 只下載source code, 需要自己build library
* NuGet, 只能搭配Visual Studio, library會安裝到project目錄下, 不同project會有重複下載的問題
<!-- .slide: data-transition="fade-out" -->
---
## Q & A