我有一个目录结构,如下所示:
.
├── bitbucket-pipelines.yml
├── MANIFEST.in
├── pylintrc
├── setup.cfg
├── setup.py
├── src
│ ├── bin
│ │ ├── __init__.py
│ │ └── project.py
│ ├── __init__.py
│ └── ml_project
│ ├── configurations
│ │ └── precommit
│ ├── core
│ │ ├── command
│ │ │ ├── abs_command.py
│ │ │ ├── __init__.py
│ │ │ ├── no_command.py
│ │ │ ├── precommit.py
│ │ │ ├── project_utils.py
│ │ │ ├── setupsrc.py
│ │ │ └── setuptox.py
│ │ ├── configurations
│ │ │ └── precommit
│ │ └── __init__.py
│ └── __init__.py
└── tox.ini在对项目进行打包时,我的要求基本上是将文件.gitlint和.pre-commit-config.yaml文件复制到ml_project包的configurations/precommit文件夹中。Python只是一个普通的目录,并不是一个configurations包,因为它不包含.py文件。
小编辑:.gitlint和.pre-commit-config.yaml与setup.py处于同一级别。
我的setup.py如下所示:
"""Setup script."""
import io
import re
import os
import shutil
from setuptools import setup
PROJECT_NAME = "ml_project"
CONFIGURATIONS_DIR_NAME = "configurations"
FULL_CONFIG_DIR = os.path.join("src", PROJECT_NAME, CONFIGURATIONS_DIR_NAME)
def get_version() -> str:
"""Return the version stored in `ml_project/__init__.py:__version__`."""
# see https://github.com/pallets/flask/blob/master/setup.py
with io.open("src/ml_project/__init__.py", "rt", encoding="utf8") as init_file:
return re.search(r'__version__ = "(.*?)"', init_file.read()).group(1)
def add_config_files_for_package(source_dir: str = None) -> None:
if not source_dir:
source_dir = os.path.dirname(os.path.abspath(__file__))
config_files = {"precommit": [".gitlint", ".pre-commit-config.yaml"]}
for config in config_files:
config_dir = os.path.join(source_dir, FULL_CONFIG_DIR, config)
for file in config_files[config]:
shutil.copyfile(
os.path.join(source_dir, file), os.path.join(config_dir, file)
)
add_config_files_for_package()
setup(version=get_version())因此,在运行python setup.py sdist时,我使用add_config_files_for_package函数进行复制。
我有一个MANIFEST.in文件,如下所示:
include .gitlint
include .pre-commit-config.yaml
graft src/ml_project最后,下面是我的setup.cfg:
[options]
package_dir =
=src
packages = find:
include_package_data = true
install_requires =
click
pre-commit
pyyaml
gitlint
[options.packages.find]
where = src
[options.entry_points]
console_scripts =
project = bin.project:main
[options.extras_require]
tests =
pytest
pytest-mock
pyfakefs
pyyaml
configparser
linting =
pylint
testdocs =
pydocstyle
pre-commit =
pre-commit
[semantic_release]
version_variable = ml_project/__init__.py:__version__这运行得很好,但我的问题是:有没有更好、更标准的方法来做这件事?就像根本不写函数?
感谢您提前给我指点。
发布于 2020-01-24 01:23:17
正如注释中所提到的,最好将这些文件放在src/ml_project/configurations/precommit目录中,并在项目的根目录下创建指向这些文件的符号链接。符号链接应该可以在git上运行得很好,但是有些平台(比如Windows)对符号链接的支持不是很好。
或者,这些文件的副本可能只是构建过程中的另一个步骤(最终通过自定义setuptools命令),应从Makefile (例如,或任何其他类似工具)和CI/CD工具链(在本例中为bitbucket-pipelines.yml)触发。
https://stackoverflow.com/questions/59855409
复制相似问题