如果你有多個模塊需要發布,而它們又存在於多個包中,那么指定整個包比指定模塊可能要容易地多。即使你的模塊並不在一個包內,這種做法也行的通;你可以告訴Distutils從根包(root package)處理模塊,並且它工作起來和其他任意的包一樣(除非你不需要擁有一個__init__.py
文件)。
例1.1 根包發布
文件結構為:
<root>/ setup.py foo.py bar.py
setup腳本可以這樣寫:
from distutils.core import setup setup(name='foobar', version='1.0', packages=[''], )
(空字符串表示根包)
例1.2 根包發布(模塊在子目錄)
如果你把上例中兩個模塊文件移入到一個子目錄,但是它們仍在根包中,如:
<root>/ setup.py src/ foo.py bar.py
那么將仍然指定根包,但是你必須告訴Distutils那些源文件在哪里:
from distutils.core import setup setup(name='foobar', version='1.0', package_dir={'': 'src'}, packages=[''], )
例2.1 包發布
如果你想發布在同一包中(或者在子包中)的多個模塊。比如,如果foo 和bar 模塊屬於包foobar,文件結構如下:
<root>/ setup.py foobar/ __init__.py foo.py bar.py
實際上這是Distutils默認的層次,一個精簡的setup腳本可以這樣寫:
from distutils.core import setup setup(name='foobar', version='1.0', packages=['foobar'], )
例2.2 包發布(模塊所在目錄名不是包名)
如果你想將模塊放入不是包名的目錄,那么你還需要用到package_dir參數。例如,如果在foobar 包中src 目錄擁有多個模塊:
<root>/ setup.py src/ __init__.py foo.py bar.py
合適的setup腳本將會是:
from distutils.core import setup setup(name='foobar', version='1.0', package_dir={'foobar': 'src'}, packages=['foobar'], )
例2.3 包發布(包存在於根目錄)
或者你想把包放在發布根目錄,如:
<root>/ setup.py __init__.py foo.py bar.py
這種情況下你的setu腳本將會是:
from distutils.core import setup setup(name='foobar', version='1.0', package_dir={'foobar': ''}, packages=['foobar'], )
(空字符串同樣也代表當前目錄)
例2.4 包發布(多子包)
如果你有多個子包,它們必須被顯在地列舉在packages參數中,但是其他任何在package_dir參數中的實體自動擴展到子包。(換句話說,Distutils並不瀏覽你的源文件樹(source tree),而是通過尋找__init__.py
文件來計算相應Python包的目錄。)因此,如果默認的層次有一個子包:
<root>/ setup.py foobar/ __init__.py foo.py bar.py subfoo/ __init__.py blah.py
那么相應的setup腳本將會是:
from distutils.core import setup setup(name='foobar', version='1.0', packages=['foobar', 'foobar.subfoo'], )
注意:發布一個包,就是將該包所在目錄所有模塊全部發布。那么我們就不能只發布包內部分模塊。
例如,文件結構如下:
<root>/ setup.py sub_package1/ __init__.py sub_model1 sub_model2 sub_package2/ __init__.py sub_model3
使用Distutils,我們無法在發布包sub_packe1
和sub_package2
的同時,不發布sub_model2
模塊。