今天看Flask的文檔,里面提到如何通過distribute發布你自己的Python包。講包含文件的時候,提到要用MANIFEST.in並將include_package_data設置為True。
由於我自己也發布過幾個包,當時並沒有設置include_package_data,而且看lxyu的包setup.py里面設置的是package_data,所以就想搞清楚到底是怎么回事。
Google了一會,最終搞清楚了區別,記錄在這里。
1、package_data
這個確實可以包含文件,但是實際上這是一個“lie”,也就是謊言。
為什么這么說呢?因為生成最終發布文件的時候有兩種命令:
$ python setup.py bdist upload
$ python setup.py sdist upload
看到了嗎?區別就是bdist和sdist。
bdist是發布二進制文件,sdist是發布源文件。
說package_data是謊言的原因就是,package_data只有在使用bdist時候才有用!也就是說如果你使用sdist的話是無法正確包含文件的!
更新:我搜到的這篇文章是2011年的,剛才搜了一下,Python2.7里面已經修正了這個問題,現在會自動把package_data里面的內容添加到MANIFEST文件中。所以實際上是間接使用了第二種方法。我個人覺得還是直接用MANIFEST.in比較好,更加統一。
2、MANIFEST.in
相比之下MANIFEST.in才是正確方法。MANIFEST.in無論在sdist還是bdist下都可以正常工作。
不過我還是有個疑問,就是include_package_data必須設置嗎?
Flask文檔中提到必須設置為True,否則MANIFEST.in不起作用。不過我自己發布包的時候並沒有設置,還是可以用,所以猜測這個參數的默認值就是True。
保險起見,還是設置為True吧。
總結起來,正確包含文件的方式是:
- 使用MANIFEST.in
- 設置include_package_data=True