[英]How to specify another tox project folder as a dependency for a tox project
我們有一個啟用tox的項目(我們稱它為“主”項目),它依賴於另一個 tox 項目(我們稱它為“庫”項目)——所有這些項目都統一在一個存儲庫中,因為它是一個大型總體項目的一部分。
該項目如何為普通用戶工作
對於作為最終用戶的常規安裝,您只需先安裝“library”,然后直接從存儲庫或任何來源安裝“main”,然后運行它。
我們的問題是什么
但是,作為開發人員,情況有所不同,因為“tox”應該可以工作,並且您可能希望同時擁有多個版本。
您通常會檢查大型總體存儲庫,然后文件系統布局是這樣的:
overarchingproject/main/
overarchingproject/main/src/
overarchingproject/main/tox.ini
overarchingproject/main/setup.py
...
overarchingproject/library/
overarchingproject/library/src/
overarchingproject/library/tox.ini
overarchingproject/library/setup.py
...
現在,如果我將 go 輸入 main/ 並鍵入“tox”,則會發生這種情況:
當前行為:它將嘗試構建依賴於“庫”的“主”項目——這顯然會導致嘗試從 pip 獲取“庫”。但是,該項目尚未發布(因此不在 pip 上)所以它不會工作 - 即使 lib 就在同一個回購協議中。
結果:它不起作用。
解決方法 1:我們可以建立自己的 package 索引/要求用戶這樣做。 然而,要求每個為該項目做出貢獻的人都使用 DevPI 或類似的東西來做這件事只是為了能夠運行單元測試似乎不是一個好主意,所以我們需要集中進行。
但是,如果我們在某個中心位置提供 package 索引或為“庫”提供 pip package,人們就無法輕松運行“main”的測試,因為他們自己創建了“庫”的修改版本:
“庫”畢竟在同一個存儲庫中,所以人們不妨在某個時候修改它。
在“主”項目文件夾中鍵入“tox”將不會輕易地在當前相鄰的“庫”版本中獲取,但只有預先打包的在線內容並不十分直觀。
解決方法 2:我們嘗試了 sitepackages=True 並在系統中安裝“library”——但是,sitepackages=True 給我們帶來了很多麻煩,總的來說這似乎不是一個好主意。
期望的行為:我們希望 tox 在同一個總體存儲庫中的那個文件夾中使用本地版本的“庫”,人們通常會在一件事中獲得:
該版本可能更新,甚至在本地進行了修改,因此這顯然是開發用戶想要使用的版本。 它存在,現在不能說 pip package。
為什么我們無論如何都想要包含子項目(“main”、“library”、...)的總體存儲庫,而不僅僅是一個項目?
我們開發了一個多守護進程的大型項目,其中包含許多用於各種目的的守護進程,在一些庫中共享代碼以形成大學課程管理系統(處理論壇、課程管理以及學生項目的附加代碼版本控制系統ETC。)。
可以只使用守護進程的一個子集,因此它們是獨立的項目是有道理的,但它們之間的聯系仍然足夠大,以至於大多數人都希望擁有其中的大部分——因此它們都在一個存儲庫中。
該庫本身也適合用於完全不同的項目,但它通常用於我們的項目 - 因此它被塞入存儲庫。 所以這意味着它總是在給定的相對路徑中,但它有單獨的 tox.ini 和單元測試。
長話短說/總結
那么我們如何才能讓 tox 在安裝項目時在另一個 toxable 項目文件夾中查找特定的依賴項,而不僅僅是 pip?
當然,“main”的常規 setup.py 安裝過程不應該亂用 tox 或搜索本地磁盤:它應該只檢查一個特定的相對路徑,然后如果那個不存在則放棄(並回退到 pip 或其他)。
所以最好是相對路徑可以以某種方式存儲在 tox.ini 中。
或者這只是一個非常糟糕的主意? 我們是否應該以不同的方式解決這個問題,使我們的“主”項目很容易與本地存儲庫中存在的“庫”的最新本地開發版本相抵觸?
您可以在主項目中使用 pip 的--editable選項,如下所示:
deps =
--editable=file:///{toxinidir}/../library
-r{toxinidir}/requirements.txt
PS 不要使用這種樣式: -e file:///{toxinidir}/../library ,因為 tox 在錯誤格式中將整個字符串作為參數傳遞給 argparse。
正如對 diabloneo 響應的評論中所建議的,可以在 tox.ini 文件中提供install_command
:
我用它來制作一個 bash 腳本,它接受所有常用的 pip 參數,然后在之前運行 pip 只需pip install --editable="file://`pwd`/../path/to/neighbour/repo"
,然后才真正運行常規的pip install $@
然后將參數傳遞給腳本(就像由 tox 直接傳遞給 pip 一樣)。 然后我將此腳本與install_command
一起使用,而不是常規的默認 pip 命令。
通過這個兩步程序,它可以正常工作:-)
我意識到問這個問題已經很久了,但可能對某人有用,我試着做同樣的事情,結果證明可以使用 tox 的distshare
目錄來完成: https://tox.wiki/en/最新/示例/general.html#access-package-artifacts-between-multiple-tox-runs
# example two/tox.ini [testenv] # install latest package from "one" project deps = {distshare}/one-*.zip
你應該嘗試單獨的工具,比如ansible
。
例子
ansible
創建並運行您的 virtualenvansible
像你子項目一樣安裝本地依賴項tox
來運行測試、lint、docs這是毒害子項目的更方便的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.