2012-02-24 60 views
1

我有一個setuptools/easy_install的小問題;也許有人可以給我一個提示,可能是什麼問題的原因:setuptools/easy_install不會安裝* .cfg文件和語言環境目錄?

要輕鬆分發到我使用setuptools的sdist命令來構建其複製到服務器和本地的tar.gz文件服務器我的Python Web應用程序的一個使用easy_install /path/to/file.tar.gz進行安裝。

到目前爲止,這似乎很好。我列出的MANIFEST.in文件的一切是這樣的:

global-include */*.py */*.mo */*.po */*.pot */*.css */*.js */*.png */*.jpg */*.ico */*.woff */*.gif */*.mako */*.cfg 

,並將所得tar.gz文件確實包含了所有我需要的文件。

只要easy_install嘗試將其實際安裝到遠程系統上,它就會變得很奇怪。出於某種原因,名爲locales的目錄和名爲migrate.cfg的配置文件將不會被安裝。這很奇怪,我找不到任何關於此的文檔,但我想這是easy_install的一些自動忽略功能?

有沒有這樣的事情?如果是這樣,我該如何讓easy_install安裝localesmigrate.cfg文件?

謝謝!

僅供參考,這裏是我setup.py的內容:

 
from setuptools import setup, find_packages 


requires = ['flup', 'pyramid', 'WebError', 'wtforms', 'webhelpers', 'pil', 'apns', \ 
      'pyramid_beaker', 'sqlalchemy', 'poster', 'boto', 'pypdf', 'sqlalchemy_migrate', \ 
      'Babel'] 

version_number = execfile('pubserverng/version.py') 

setup(
    author='Bastian', 
    author_email='[email protected]', 
    url='http://domain.de/', 
    name = "mywebapp", 
    install_requires = requires, 
    version = __version__, 
    packages = find_packages(), 
    zip_safe=False, 
    entry_points = { 
     'paste.app_factory': [ 
      'pubserverng=pubserverng:main' 
     ] 
    }, 

    namespace_packages = ['pubserverng'], 

    message_extractors = { 'pubserverng': [ 
      ('**.py', 'python', None), 
      ('templates/**.html', 'mako', None), 
      ('templates/**.mako', 'mako', None), 
      ('static/**', 'ignore', None), 
      ('migrations/**', 'ignore', None), 
     ] 
    }, 


) 

回答

1

我不想很快回答我自己的問題,但經過一些試驗和錯誤後,我找出丟失文件背後的原因是什麼。事實上,它是多個原因:

  • SOURCES.txt文件是老年人和包含的文件的完整列表,這導致他們被正確捆綁。
  • MANIFEST.in文件也是正確的,因此所有需要的文件實際上都在.tar.gz壓縮文件中,如預期的那樣。主要問題是幾個文件根本不會被安裝在目標機器上。
  • 我不得不將include_package_data = True,添加到我的setup.py文件中。完成後按預期方式安裝所有文件。

我不得不把一些研究include_package_data,以找出是否這種怪異的行爲被記錄在案的地方。 setuptools是一個真正的混亂 - 尤其是文檔。

+0

這可能是你想要的,但它可能不是.. :-)所有'include_package_data = True'的意思是說,setuptools應該在python未知的包目錄中安裝文件與包相關。設置此選項意味着您必須非常小心,以確保MANIFEST.in排除您不希望包含的文件(並在人員添加文件時進行更新)。 – 2012-02-24 13:52:50

1

您需要使用的setupdata_files功能 - 你的文件不是代碼,所以easy_install將默認不安裝它們(它不不知道他們去哪裏)。

這樣做的好處是這些文件會自動添加到MANIFEST--你不需要做任何魔法就可以讓它們自己在那裏。 (一般來說,如果setup.py自動生成的MANIFEST是不夠的,自己添加它們不會奇蹟般地讓它們安裝。)

+0

這就是爲什麼我使用MANIFEST.in文件,它適用於大多數的數據文件,如PNG格式和.mako模板。所以這很奇怪。 – BastiBen 2012-02-24 12:49:33

+0

看到我自己的答案。看起來像include_package_data丟失。 – BastiBen 2012-02-24 13:49:08

+0

@badcat:查看我的評論 - 我認爲一般情況下'include_package_data'不是您想要使用的功能 - 當您被迫顯式包含要發送的數據文件時,我發現打包更加理智,而不是排除您不想發運的數據文件。 – 2012-02-24 13:54:42

2

python中的整個包發佈系統有很多不足之處。我的問題與您的問題相似,最終通過使用distutils(而不是setuptools)解決,因爲它符合預期的include_package_data = True設置。

使用distutils允許我或多或少地保留MANIFEST.in所需的文件列表,並避免使用package_data設置,我必須複製源列表;退回是find_packages不可用。下面是我的setup.py:

from distutils.core import setup 
package = __import__('simplemenu') 

setup(name='django-simplemenu', 
    version=package.get_version(), 
    url='http://github.com/danielsokolowski/django-simplemenu', 
    license='BSD', 
    description=package.__doc__.strip(), 
    author='Alex Vasi <[email protected]>, Justin Steward <[email protected]>, Daniel Sokolowski <[email protected]>', 
    author_email='[email protected]', 
    include_package_data=True, # this will read MANIFEST.in during install phase 
    packages=[ 
     'simplemenu', 
     'simplemenu.migrations', 
     'simplemenu.templatetags', 
    ], 
    # below is no longer needed as we are utilizing MANIFEST.in with include_package_data setting 
    #package_data={'simplemenu': ['locale/en/LC_MESSAGES/*', 
    #        'locale/ru/LC_MESSAGES/*'] 
    #    }, 
    scripts=[], 
    requires=[], 
    ) 

這裏是一個MANIFEST.in文件:

include LICENSE 
    include README.rst 
    recursive-include simplemenu *.py 
    recursive-include simplemenu/locale * 
    prune simplemenu/migrations