# Pyenv + Poetry 相關指令
## Anaconda work flow
```bash=
conda create --name=<env name> python=<python version>
conda activate <env name>
pip install requirements.txt
```
- 以環境名稱做為虛擬環境的切換,當環境很多的時候,有時候會搞混哪個Project 要使用哪個環境。
- 套件相依性管理上,`pip uninstall <package>` 只**卸載主套件**而不會對相依套件洩載及管理,會造成環境髒且臃腫。
## Pyenv 安裝
### Window
使用**PowerShell** 安裝後,並**重啟PowerShell** 即可。
```bash=
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
```
可以透過以下指令確認是否安裝成功
```bash=
pyenv --version # 顯示pyenv 版本,確認是否安裝成功
pyenv install --list # 查看所以可安裝的Python 版本
pyenv install <version> # 安裝特定Python 版本
pyenv version # 查看目前使用的Python 版本與安裝路徑
```
## Poetry 安裝
### macOS / Linux / WSL(Windows Subsystem for Linux)
```bash=
curl -sSL https://install.python-poetry.org | python3 -
```
記得設置環境變數
- `$HOME/.local/bin` for Unix
在`.zshrc` `.bashrc` `.bash_profile` 新增
```bash
export PATH=$PATH:$HOME/.local/bin
```
### Windows
```bash=
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -
```
- 手動添加`%APPDATA%\Python\Scripts` 至環境變數
### 建議設定
```bash=
# 將虛擬環境綁定在專案上
poetry config virtualenvs.in-project true
```
## Pyenv + Poetry Work Flow
```bash=
git clone <git url> # 複製Project
cd <project folder> # 進入Project 資料夾
pyenv install <Python version> # (Optional) 如果沒安裝過該Python 版本
poetry env use <Python version> # 於Project folder 中創建Python 虛擬環境
poetry install # 依照poetry.lock 安裝套件至虛擬環境
```
## Poetry 指令
```bash=
poetry init # 於專案資料夾初始化
poetry config --list # 查看config 內容
portry config <var> <value> # 設定config 中的var為value
poetry env use/remove python # 建立/移除虛擬環境 可另外指定Python 版本
poetry shell # 啟動虛擬環境,需先移至專案目錄下,使用exit 即可退出
poetry add/remove <package> # 相當於pip install/uninstall,會更改pyproject.toml & poetry.lock 內容
# -G dev, --group dev 將只在開發環境使用的套件放置於dev-dependencies 區塊中
poetry lock # 若有手動更改pyproject.toml,需使用此指令同步更新poetry.lock 內容。
# 此指令僅會更新poetry.lock,並「不會安裝」套件至虛擬環境。
poetry install # 安裝套件至虛擬環境
poetry update # 更新全部可能可以更新的套件
poetry update <package> # 更新特定套件
poetry show --tree # 使用樹狀結構呈現poetry.lock 的套件內容
poetry show <package> --tree # 使用樹狀結構呈現poetry.lock 的特定套件內容
poetry export -f requirements.txt -o requirements.txt --without-hashes # 相當於pip freeze
```
1. poetry env use python 預設會統一建立在特定目錄Cache中,建議將虛擬環境綁定在專案上。`
```bach
poetry config virtualenvs.in-project true
```
2. **`poetry ad`** 相當於 **`pip install`**
3. **`poetry.lock`** 相當於 **`requirements.txt`**
## Reference
[Pyenv Github](https://github.com/pyenv-win/pyenv-win#installation)
[Poetry](https://python-poetry.org/docs/)
[Poetry 完全入門指南](https://blog.kyomind.tw/python-poetry/)