簡體   English   中英

管理依賴於其他軟件包的python軟件包

[英]managing a python package that depends on other packages

我無法想象這是一個原始問題,但是我似乎找不到答案。 我一定使用了錯誤的搜索詞。

我們的團隊正在開發Python實用程序包。 我們將其稱為“工具”。 “工具”中的各種類需要其他軟件包和模塊。

“工具”有幾個類,名稱如下:

  • 解析器
  • 記錄儀
  • FooTester
  • BarTester

還有2個其他軟件包。 一個稱為“ foo”,另一個稱為“ bar”。 一些團隊僅使用“ foo”包,一些團隊僅使用“ bar”包。 要求僅使用“ foo”軟件包的團隊不要安裝“ bar”軟件包。

“ FooTester”類需要“ foo”包,因為其中包含“ import foo”。 “ BarTester”類需要“ bar”包,因為其中包含“ import bar”。

兩個團隊都希望將以下內容放在腳本的頂部:“導入工具”,然后使用其各自的Tester類。

正如我們現在所擁有的,除非您安裝了“ bar”和“ foo”軟件包,否則您將無法執行此操作。

這樣做的標准方法是什么? 在那兒?

我認為FooTester將成為foo軟件包的一部分,而BarTester將成為bar軟件包的一部分。 (或者也許每個都在自己的包/模塊中。)

鑒於要求使用foo軟件包的團隊不要安裝bar軟件包,將這兩個測試人員都放在同時使用的tools軟件包中似乎很奇怪。

“工具”可以有條件地定義其類:

fooed = barred = False

try:
    import foo
    fooed = True
    class FooTester(object):
        pass # your class here...
except ImportError:
    pass

try:
    import bar
    barred = True
    class BarTester(object):
        pass # your class here...
except ImportError:
    pass

if not fooed or barred:
    raise RuntimeError("You are not fooed or barred")

解決方案很少

選項全部:安裝所有內容,忽略您的特殊要求

這不能回答您的問題,但可能是最有效的解決方案。 除非您有一些由於任何原因而難以安裝的軟件包,否則不值得為不同的團隊而分開安裝它們。 如果您算出實現此目標所需的時間,那將是不可行的。 如果您擔心安裝軟件包所需的時間,請參見相關的SO答案,以進行pip配置 ,從而將安裝速度降低到一到兩秒,甚至對於需要編譯的軟件包也是如此。

多選件:將解決方案組織成多個多層包

您可以將解決方案拆分為以下軟件包

  • tool.common
  • tool.teamA
  • tool.teamB
  • tool.teamB

在這種情況下,工具就是所謂的名稱空間包,並且應為空。

任何軟件包都可能需要安裝其他軟件包,通常tool.common可能是所有其他軟件包中必需的一部分。

選項點:對requirements.txt .txt文件使用點

還有其他常見的模式,使用piprequirements.txt文件。

pip允許安裝在某些文本文件中聲明的文件,通常稱為reuirements.txt ,但任何其他名稱都可以使用。

而不是使用:

$ pip install tool.teamA

人們會以某種方式使代碼可以使用,例如:

$ git clone repo4tools

在該存儲庫中,將有文件

  • requirements-teamA.txt
  • requirements-teamB.txt
  • requirements-teamC.txt

以及其他需要的東西。

每個需求文件將僅包含給定團隊所需的軟件包。

人們會簡單地打電話給:

$ cd repo4tools
$ pip install -r requirements-teamA.txt

對於開發人員而言,最后一種選擇已變得非常流行,尤其是與virtualenv結合使用時。 有時每個團隊甚至有多個需求文件,一個是實際使用的文件,另一個是用於開發和測試的文件等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM