setup.py从bdist中排除了一些python文件

Sim*_*rli 9 python deployment django installation setuptools

我有一个这种架构的django项目:

  • setup.py
  • 项目/
    • __init__.py
    • manage.py
    • 设置/
      • __init__.py
      • base.py
      • dev.py
    • 网址/
      • __init__.py
      • base.py
      • dev.py

我想在没有'dev.py'文件的.egg中部署它.我尝试了不同的方法:首先,用a

find_packages(exclude=['*.dev','dev'])
Run Code Online (Sandbox Code Playgroud)

,然后使用MANIFEST.in,其中包含:

global-exclude dev.py
Run Code Online (Sandbox Code Playgroud)

当我做一个sdist时,第二个解决方案似乎有效 - 当我安装它时出现此警告:

warning: no previously-included files matching 'dev.py' found anywhere in distribution 
Run Code Online (Sandbox Code Playgroud)

,但不能用bdist-egg工作.

这是我的setup.py的一部分:

from setuptools import setup, find_packages
project import VERSION


packages = [
        'project',
        'project.settings',
        'project.urls',
]

setup(name='project',
  version=VERSION,
  package_dir = {'project' : 'project'},
  description  = 'My Project',
  author       = 'Simon Urli',
  author_email = '',
  url = '',
  packages = packages, #find_packages('project',exclude=['*.dev', 'dev']),
)
Run Code Online (Sandbox Code Playgroud)

请注意,我使用python 2.6.6,也许这很重要.知道如何创建我的鸡蛋正确排除dev文件?

hoe*_*ing 7

我最近遇到了同样的问题(虽然我必须构建一个轮子而不是一个鸡蛋),但解决方案对bdist_eggbdist_wheel. 你必须要覆盖的方法find_package_modulesbuild_py

import fnmatch
from setuptools import find_packages, setup
from setuptools.command.build_py import build_py as build_py_orig


exclude = ['*.dev']


class build_py(build_py_orig):

    def find_package_modules(self, package, package_dir):
        modules = super().find_package_modules(package, package_dir)
        return [(pkg, mod, file, ) for (pkg, mod, file, ) in modules
                if not any(fnmatch.fnmatchcase(pkg + '.' + mod, pat=pattern)
                for pattern in exclude)]


setup(
    packages=find_packages(),
    cmdclass={'build_py': build_py},
)
Run Code Online (Sandbox Code Playgroud)

在此示例中,dev所有包中命名的模块将从构建中排除。

如您所见,没有必要使用排除项,find_packages()因为您仍然需要包含所有包,而是过滤在每个包中找到的模块文件。该类build_py非常通用,如果需要重用,可以在单独的库中重构;唯一特定于项目的内容是排除模式列表。


小智 -1

def without_app(item):
    # http://docs.python.org/release/2.2.1/lib/string-methods.html
    return not bool(item.find('app_name') + 1) 

# help(filter) - use in command line to read the docstring
packages = filter(without_app, find_packages()) 
Run Code Online (Sandbox Code Playgroud)