我尝试编写setup.py
来安装带有pip
的Flask应用程序。我有大量的非Python文件要作为包数据安装,例如静态资产。我需要递归地包含这些文件,因为有很多嵌套的子目录,例如:在以下示例的bootstrap/
中:
myproject
├── MANIFEST.in
├── setup.py
└── myproject/
└── app/
├── __init__.py
├── static/
| ├── bootstrap/ (*)
| | └── ...
| ├── some.json
| └── other.json
└── templates/
└── index.html
似乎主要有两种方法可以做到这一点,但是我无法使用这两种方法。
MANIFEST.in
和include_package_data=True
# setup.py
setup_info = dict(
...
include_package_data=True,
#package_data={},
...
)
以及MANIFEST.in
中的以下内容:
recursive-include myproject *.json *.html
后跟我的项目根目录中的pip install .
。此方法根本不安装任何包数据文件。事实上,当我尝试MANIFEST.in
,graft
等时,它似乎忽略了我的exclude
,而且它们似乎没有效果。
package_data
与自定义递归查找函数# setup.py
EXTENSIONS = ['*.js', '*.html']
def recursive_get_package_data():
matches = []
THIS_FILE_DIR = os.path.dirname(os.path.realpath(__file__))
for ext in EXTENSIONS:
for root, dirnames, filenames in os.walk(THIS_FILE_DIR):
for filename in fnmatch.filter(filenames, ext):
matches.append(os.path.join(os.path.relpath(root, THIS_FILE_DIR),
filename))
return matches
setup_info = dict(
...
#include_package_data=False,
package_data = {'': recursive_get_package_data()},
...
}
setup(**setup_info)
然后是我的项目根目录中的pip install .
。
此方法根本不安装任何包数据文件。但是,如果不是使用recursive_get_package_data()
中的显式相对路径,而是使用扩展globs的列表,即
setup_info = dict(
...
#include_package_data=False,
package_data = {'': EXTENSIONS},
...
)
它只能安装我.js
的{{1}}和.html
个文件。
我错过了什么?我是否需要同时使用__init__.py
和include_package_data
?
更新:我设法通过删除顶级目录来获得第二种方法:
package_data
并将其作为关键字传递给:
THIS_FILE_DIR = os.path.dirname(os.path.realpath(__file__))
THIS_FILE_DIR = os.path.join(THIS_FILE_DIR, 'myproject')
然而, package_data = {'myproject': recursive_get_package_data()},
仍然没有运气。