教程文档: https://docs.python.org/2/distutils/index.html

Since setuptools no longer serves as the default build tool, one must explicitly opt in (by providing a pyproject.toml file) to use this library website

pyproject.toml

  1. [build-system]
  2. requires = [
  3. "setuptools>=40.1",
  4. "wheel"
  5. ]
  6. build-backend = "setuptools.build_meta"

setup.py

from setuptools import setup

setup()

setup.cfg

[metadata]
name = lico-core-base
version = 6.2.0
license = Lenovo
classifiers =
    Development Status :: 5 - Production/Stable
    Programming Language :: Python :: 3
    Programming Language :: Python :: 3.6
    Operating System :: POSIX
    Operating System :: POSIX :: Linux

[options]
python_requires = >=3.6
namespace_packages=
    lico
    lico.core
packages = find_namespace:
include_package_data = true
zip_safe = false
install_requires =
    setuptools>=39.2
    Django~=2.2.12
    djangorestframework~=3.11
    toml~=0.10
    py~=1.5
    celery~=4.1
    APScheduler>=3.3.1
    python-dateutil>=2.6.1

[options.packages.find]
include = lico.core.*

[options.data_files]
etc/lico =
    etc/lico.ini
    etc/lico.paste.ini
    etc/lico.supervisor.ini
etc/lico/lico.supervisor.d =
    etc/lico.supervisor.d/lico-core-base.ini
    etc/lico.supervisor.d/lico-core-beat.ini
etc/lico/lico.logging.d =
    etc/lico.logging.d/lico-base.ini
    etc/lico.logging.d/lico-beat.ini

[options.entry_points]
console_scripts =
    lico = lico.core.base.main:main [executable]
paste.app_factory =
    main = lico.core.base.wsgi:make_application

[options.extras_require]
executable =
    gunicorn>=20
    supervisor>=3.3.4
    PasteDeploy>=1.5
    PyMySQL>=0.8
    concurrent-log-handler>=0.9.16
    lico-auth
    lico-password-tool
test =
    pytest>=4.1.0
    pytest-cov>=2.5
    pytest-mock>=3.0
    pytest-django>=3.1
    pytest-pythonpath>=0.7

[tool:pytest]
django_find_project = false
addopts =
    --ds=tests.django_settings
    --cov --cov-report term-missing --no-cov-on-fail --cov-fail-under=99
norecursedirs = dist build .tox
testpaths = tests/

[flake8]
max-complexity = 10
show-source = true

[isort]
combine_as_imports = true
default_section = THIRDPARTY
include_trailing_comma = true
known_first_party = lico
multi_line_output = 5

[coverage:run]
source = lico
omit =

[coverage:report]
exclude_lines =
    pass$
    import .+$
    from .* import .+$
    pragma: no cover

MANIFEST.ini

Sometimes this is enough, but usually you will want to specify additional files to distribute. The typical way to do this is to write a manifest template, called MANIFEST.in by default. The manifest template is just a list of instructions for how to generate your manifest file, MANIFEST, which is the exact list of files to include in your source distribution. The sdist command processes this template and generates a manifest based on its instructions and what it finds in the filesystem.

If you prefer to roll your own manifest file, the format is simple: one filename per line, regular files (or symlinks to them) only. If you do supply your own MANIFEST, you must specify everything: the default set of files described above does not apply in this case
Manifest instruction

编写规范: https://docs.python.org/2/distutils/sourcedist.html

include dev-requirements.txt
include tox.ini .bumpversion.cfg
include lico-core-base.spec
include LICENSE

graft etc
graft tests

prune etc/lico.ini.d

recursive-exclude * __pycache__
recursive-exclude * *.py[co]

dev-requirements.txt

bumpversion>=0.5
tox>=2.8
flake8>=3.4
flake8-isort>=2.2
isort>=4.2

tox.ini

[tox]
minversion = 3.3
isolated_build = true
envlist = py36, flake8

[testenv:flake8]
deps =
    flake8>=3.4
    flake8-isort>=2.2
skip_install = true
commands =
    flake8 lico tests

[testenv]
setenv =
    PIP_FIND_LINKS = http://files.ssw.lenovo.com/lico-pub/lico/repo/pip/
    PIP_TRUSTED_HOST = files.ssw.lenovo.com
extras = test
commands =
    pytest --basetemp={envtmpdir}

.bumpversion.cfg

[bumpversion]
current_version = 6.2.0
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)
serialize = {major}.{minor}.{patch}

[bumpversion:file:setup.cfg]

[bumpversion:file:lico-core-base.spec]
search = Version:        {current_version}
replace = Version:        {new_version}

[bumpversion:file:lico-core-base-libs.spec]
search = Version:        {current_version}
replace = Version:        {new_version}

lico-core-base.spec

https://docs.python.org/2/distutils/builtdist.html
rpm 打包指导: https://rpm-packaging-guide.github.io/#what-is-a-spec-file

# Copyright 2020-present Lenovo
# Confidential and Proprietary

%global flavor %{nil}

%if %{with host}
%global flavor host
%endif

%if %{with kube}
%global flavor kube
%endif

%if "%flavor" == ""
ExclusiveArch:  do_not_build
%endif

%global pkg_name lico-core-base

Name:           %{pkg_name}-%{flavor}
Version:        6.2.0
Release:        1%{?dist}
Summary:        Restful server for lico project

License:        Lenovo
URL:            https://hpcgitlab.labs.lenovo.com/lico/lico-six/lico-core/lico-core-base
Source0:        %{pkg_name}-%{version}.tar.gz

BuildArch:      noarch

BuildRequires:  lico-rpm-macros

%if 0%{?sles_version} || 0%{?suse_version}
BuildRequires:  systemd-rpm-macros
%endif

%if 0%{?sles_version} || 0%{?suse_version}
Requires(pre):      systemd
%endif
Requires(post):     systemd
Requires(preun):    systemd
Requires(postun):   systemd

Requires:       font(:lang=zh-cn)
Requires:       font(:lang=en)

Requires:       lico-core-base-libs = %{version}
Requires:       lico-prepare-%{flavor} >= %{lico_ver}
Requires:       lico-prepare-%{flavor} < %{lico_next_ver}

Provides:       %{pkg_name} = %{version}-%{release}

Obsoletes:      %{name} < %{version}-%{release}
Obsoletes:      %{pkg_name} < %{version}-%{release}

%description
Restful server for lico project

%prep
%autosetup -n %{pkg_name}-%{version}
# Remove bundled egg-info
rm -rf %{pkg_name}.egg-info

%install

# config
%{__install} -Dp -m 644 etc/lico.%{flavor}.ini %{buildroot}%{_licoconfdir}/lico.ini
%{__install} -d %{buildroot}%{_licoconfdir}/lico.ini.d

%{__install} -Dp -m 644 etc/lico.paste.ini %{buildroot}%{_licoconfdir}/lico.paste.ini
%{__install} -Dp -m 644 etc/lico.logging.d/lico-beat.ini %{buildroot}%{_licologconfdir}/lico-beat.ini
%{__install} -Dp -m 644 etc/lico.logging.d/lico-base.ini %{buildroot}%{_licologconfdir}/lico-base.ini

sed -i 's;%%(ENV_LICO_RUN_FOLDER)s;%_licorundir;g' etc/lico.supervisor.ini etc/lico.supervisor.d/%{pkg_name}.ini
sed -i 's;%%(ENV_LICO_LOG_FOLDER)s;%_licologdir;g' etc/lico.supervisor.ini etc/lico.supervisor.d/%{pkg_name}.ini
sed -i 's;%%(ENV_LICO_STATE_FOLDER)s;%_licostatedir;g' etc/lico.supervisor.ini etc/lico.supervisor.d/%{pkg_name}.ini
sed -i 's;%%(ENV_LICO_CONFIG_FOLDER)s;%_licoconfdir;g' etc/lico.supervisor.ini etc/lico.supervisor.d/%{pkg_name}.ini
sed -i 's;%%(ENV_PYTHON_PREFIX)s;%_prefix;g' etc/lico.supervisor.ini etc/lico.supervisor.d/%{pkg_name}.ini
sed -i 's;%%(ENV_PYTHON_VERSION)s;%python3_version;g' etc/lico.supervisor.ini etc/lico.supervisor.d/%{pkg_name}.ini

%{__install} -Dp -m 644 etc/lico.supervisor.ini %{buildroot}%{_licoconfdir}/lico.supervisor.ini
%{__install} -Dp -m 0644 etc/lico.supervisor.d/%{pkg_name}.ini %{buildroot}%{_licoconfdir}/lico.supervisor.d/%{pkg_name}.ini

# runtime dir
%{__install} -d %{buildroot}%{_licostatedir}/core/

# service
%{__install} -Dp -m 0644 etc/lico.service %{buildroot}%{_unitdir}/lico.service
%{__install} -Dp -m 0644 etc/lico-beat.service %{buildroot}%{_unitdir}/lico-beat.service

%pre
%if 0%{?sles_version} || 0%{?suse_version}
%service_add_pre lico.service
%service_add_pre lico-beat.service
%endif

%post
%if 0%{?sles_version} || 0%{?suse_version}
%service_add_post lico.service
%service_add_post lico-beat.service
%else
%systemd_post lico.service
%systemd_post lico-beat.service
%endif

%preun
%if 0%{?sles_version} || 0%{?suse_version}
%service_del_preun lico.service
%service_del_preun lico-beat.service
%else
%systemd_preun lico.service
%systemd_preun lico-beat.service
%endif

%postun
%if 0%{?sles_version} || 0%{?suse_version}
%service_del_postun lico.service
%service_del_postun lico-beat.service
%else
%systemd_postun_with_restart lico.service
%systemd_postun_with_restart lico-beat.service
%endif

%files
%defattr(-,root,root,-)
%license LICENSE

# config
%config(noreplace) %{_licoconfdir}/lico.ini
%dir %{_licoconfdir}/lico.ini.d
%config(noreplace) %{_licoconfdir}/lico.paste.ini
%config(noreplace) %{_licoconfdir}/lico.supervisor.ini
%dir %{_licoconfdir}/lico.supervisor.d/
%config(noreplace) %{_licoconfdir}/lico.supervisor.d/%{pkg_name}.ini
%config(noreplace) %{_licologconfdir}/lico-beat.ini
%config(noreplace) %{_licologconfdir}/lico-base.ini

# service
%{_unitdir}/lico.service
%{_unitdir}/lico-beat.service

# runtime dir
%{_licostatedir}/core

%changelog
* Thu Dec 14 2020 Liang Wang <wangliang23@lenovo.com> - 6.2.0-1
- Upgrade to 6.2.0.

* Fri Apr 17 2020 Yunfei Shi <shiyf2@lenovo.com> - 1.0.0-1
- Initial package.

LICENSE

All Rights Reserved. 2020-present Lenovo Corp.