2012-02-24 66 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