我有一个这种架构的django项目:
我想在没有'dev.py'文件的.egg中部署它。我尝试了不同的方法:首先,用
find_packages(exclude=['*.dev','dev'])
,然后使用MANIFEST.in,其中包含:
global-exclude dev.py
当我执行sdist时,第二个解决方案似乎有效 - 在我安装它时出现此警告:
warning: no previously-included files matching 'dev.py' found anywhere in distribution
,但不能用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']),
)
请注意,我使用python 2.6.6,也许这很重要。 知道如何创建我的鸡蛋正确排除dev文件?
答案 0 :(得分:2)
我最近遇到了同样的问题(虽然我不得不建造一个轮子而不是鸡蛋),但bdist_egg
和bdist_wheel
的解决方案同样如此。您必须覆盖find_package_modules
中的方法build_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},
)
在此示例中,将从构建中排除所有包中名为dev
的模块。
如您所见,由于您仍然需要包含所有软件包,因此无需在find_packages()
中使用排除项,而是过滤每个软件包中的模块文件。类build_py
非常通用,如果需要重用它,可以在单独的库中重构;唯一的项目特定内容是排除模式列表。
答案 1 :(得分:-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())