通過shell函數建立僅含指定安裝包及其版本資訊的requirements.txt

2020-08-10 11:00:34

通過自定義shell命令建立僅含指定安裝包及其版本資訊的requirements.txt

常見的環境復現/遷移方案

  1. pip freeze 包含了當前環境所包含的全部依賴包資訊,影響復現者對主次依賴的判斷;
  2. export yml 通過建立 yaml 文字實現環境打包,包含 pip 指定包安裝及相關依賴資訊,但存在跨平臺問題;
  3. 以及其他 --from-history 等 flag 都旨在解決相關問題;

動機

根據實際的包安裝過程生成一種具有高可讀性的 requirements.txt 環境依賴包文字,嚴格按照安裝先後 先後排序,只列舉指定安裝包及其版本資訊。

解決方案

通過自定義 pip-installpip-uninstall shell command 替代原有的 pip install/uninstall 安裝包工作流,並對 requirements.txt 進行同步更新:

pip-install command (BSD & GNU)

function pip-install() {
    # loop through all listed requirements
    for var in "$@"
    do
        # attempt to install it
        pip install $var
        # add it to the requirements.txt file
        pip freeze | grep -i "^$var=" >> requirements.txt
    done

    # remove duplicates in the requirements.txt
    awk -i inplace '!a[$0]++' requirements.txt
}

pip-uninstall command (GNU請先閱讀)

function pip-uninstall() {
    for var in "$@"
    do
        pip uninstall $var
        # for macOS (BSD Unix)
		# for GNU distribution using sed instead.
        gsed -i "/$var==./d" requirements.txt
        # i.e. GNU: sed -i ...
    done
}

如何使用

  1. 通過編輯器開啓 ~/.zshrc~/.bashrc 組態檔;
  2. 將以上函數放入;
  3. 儲存並 source 組態檔;
  4. 開啓 terminal 進行測試:$ pip-install/pip-uninstall