Python 高手编程系列一百五十四:你自己的包索引或索引镜像

Python 高手编程系列一百五十四:你自己的包索引或索引镜像你可能会想要运行你自己的 Python 包索引,主要有以下 3 个原因。 ● 官方的 Python 包索引没有任何可用性保证。它由 Python 软件基金会运行&#

代码预处理(JavaScript 超集预处理、缩小/混淆/合并资产、执行SASS 或LESS)

对于像编译本地化文本这样的操作(例如Django的COMPILEMessage),

两者都可以用作setup.py 脚本中sdist/bdist 命令的一部分。

使用正确的MANIFEST.in 文件可以轻松处理非Python 预处理代码。一定,

最好在setuptools 包中setup() 函数调用的install_requires 参数中指定依赖项。

当然,打包整个应用程序需要额外的工作,包括提供您自己的自定义安装工具。

命令或覆盖现有命令,这有很多好处,可以使您的项目部署更快、更可靠。

作为示例,我们将使用基于Django 的项目(Django 版本1.9)。选择这个框架的原因是

它可能是同类中最流行的Python 框架,因此您可能已经在某种程度上熟悉它。在此刻

对于这样的项目,典型的文件结构可能如下所示:

$tree .-I __pycache __ –dirsfirst

网页样本

设置

__init _.py

设置.py

urls.py

wsgi.py

语言环境

LC 信息

django.po

ja

LC 信息

django.po

pl

LC _MESSAGES

django.po

我的应用程序

迁移

__init _.py

静态

js

myapp.js

苏斯

myapp.scss

模板

index.html

_view.html 的一部分

__init__.py

admin.py

apps.py

models.py

测试.py

views.py

__init__.py

管理.py

MANIFEST.in

自述文件.md

setup.py

15个目录,23个文件

请注意,这与典型的Django 项目模板略有不同。默认情况下,WSGI应用程序、配置模块

块和URL 设置的包名称与项目名称相同。我决定采用打包方法,因此我将其命名为webxample。这可能会导致混乱,因此我们建议将其重命名为conf。

我不会深入研究可能实现的细节,只是做一些简单的假设。

此示例应用程序有几个外部依赖项,包括两个常用的Django 包: djangorest

框架和django-allauth,以及非Django 包:gunicorn。

djangorestframework 和django-allauth 位于webexample.webexample 中。

由配置模块中的INSTALLED_APPS 指定。

该应用程序已本地化为三种语言(德语、英语、波兰语),但不需要编译语言。

gettext 消息存储在仓库中。

我们不喜欢简单的CSS 语法,所以我们决定使用更强大的SCSS 语言。

SASS 将其转换为CSS。

了解项目的结构后,您可以创建setup.py 脚本并让setuptools 执行以下操作:

内容。

编译webxample/myapp/static/scss 目录中的SCSS 文件。

在webexample/locale 目录中将gettext 消息从.po 格式编译为.mo 格式。

安装要求:

提供包入口点的新脚本。使用自定义命令而不是manage.py。

脚本。

这里有好运。 Python 与libsass(SASS 引擎的C/C++ 端口)捆绑在一起,并提供:

提供与setuptools 和distutils 的集成。以最少的配置提供自定义功能。

定义一个setup.py命令来执行SASS编译,如下:

从setuptools 导入设置

环境(

name=\’网络样本\’,

setup_requires=[‘libsass=0.6.0’],

sass_manifests={

“webxample.myapp”:(“静态/sass”,“静态/css”)

},

因此,您可以输入“python setup.py build_scss”来编译您的SCSS文件,如下所示:

使用CSS 而不是手动运行sass 命令或对setup.py 脚本进行子处理。这还不够。随它去

我们的生活变得更加轻松,但我们希望整个分发过程完全自动化,并能够一步创建新版本。

书。为了实现这一点,我必须覆盖一些现有的setuptools 分发命令。

setup.py 文件通过打包处理一些项目准备步骤。一个例子是:

导入操作系统

从setuptools 导入设置

从setuptools 导入find_packages

从distutils.cmd 导入命令

从distutils.command.build 导入构建作为_build

尝试:

来自django.core.management.commands.compilemessages

将命令导入为CompileCommand

除了导入错误:

注意:安装期间 django 可能不可用

编译命令=无

这个环境是必需的

os.environ.setdefault(

\”DJANGO_SETTINGS_MODULE\”, \”webxample.conf.settings\”

类build_messages(命令):

\”\”\’ Django 构建中gettext 消息的自定义命令。

””

description=\”\”\”编译gettext 消息\”\”\”

用户选项=[]

def 初始化选项(self):

通过

def Finalize_options(self):

通过

德弗兰(个人) :

if 编译命令:

编译命令().handle(

详细程度=2,区域设置=[],排除=[]

: 其他

引发运行时错误(“无法构建翻译”)

类构建(_build):

\”\”\’ 覆盖添加额外构建步骤的构建命令。

””

子命令=[

(\’build_messages\’,无),

(\’build_sass\’,无),

] + _build.sub_commands

环境(

name=\’网络样本\’,

setup_requires=[

\’libsass=0.6.0\’,

\’姜戈=1.9.2\’,

],

安装要求=[

\’姜戈=1.9.2\’,

“枪兽==19.4.5”,

“djangorestframework==3.3.2”,

“django-allauth==0.24.1”,

],

包=find_packages(\’.\’),

sass_manifests={

“webxample.myapp”:(“静态/sass”,“静态/css”)

},

cmdclass={

“构建消息”: 构建消息,

\’构建\’: 构建,

},

入口点={

\’console_script\’: {

“webxample=webxample.manage:main”,

}

}

这一实现允许您仅使用一个终端命令来构建所有资产并创建webxample 文件。

项目创建包源码分发,代码如下。

$ python setup.py 构建sdist

如果您已经有自己的包索引(使用devpi 创建),则可以添加install 子命令。

或者,使用twine 使您的组织可以使用pip 来使用该包。如果仔细查看setup.py 脚本,您会看到

您可以看到创建的源代码分发的结构包含编译后的gettext 消息和从SCSS 文件生成的CSS 样式表,如下所示。

$ tar -xvzf dist/webxample-0.0.0.tar.gz 2 /dev/null

$tree webxample-0.0.0/-I __pycache __ –dirsfirst

webexample-0.0.0/

网页样本

设置

__init _.py

设置.py

urls.py

wsgi.py

语言环境

LC 信息

django.mo

django.po

ja

LC 信息

django.mo

django.po

pl

LC _MESSAGES

django.mo

django.po

我的应用程序

迁移

__init _.py

静态

CSS

myapp.scss.css

js

myapp.js

模板

index.html

_view.html 的一部分

__init__.py

admin.py

apps.py

models.py

测试.py

views.py

__init__.py

管理.py

webxample.egg-info

PKG-INFO

SOURCES.txt

dependency_links.txt

.txt 为必填项

Top_level.txt

MANIFEST.in

包装信息

自述文件.md

设置.cfg

setup.py

16个目录,33个文件

使用这种方法还有一个额外的好处,即为您的项目提供自己的入口点而不是Django。

默认的manage.py脚本。您现在可以使用此入口点来运行所有Django 管理命令。例如:

$ web 示例迁移

$webxamplecollectstatic

$ webxamp运行服务器

这需要对manage.py脚本进行轻微更改,以与setup()的entry_points参数兼容。

创建内容,以便代码的主要部分由main() 函数调用包装,如下所示。

#!/usr/bin/env python3

导入操作系统

导入系统

def main():

os.environ.setdefault(

\”DJANGO_SETTINGS_MODULE\”, \”webxample.conf.settings\”

从django.core.management 导入execute_from_command_line

从命令行执行(sys.argv)

如果名称==“主”:

主要的()

不幸的是,很多框架(包括Django)在设计时并没有以这种方式打包项目的思想。那是

但是,根据项目的目标,将项目转换为包可能需要进行许多更改。对于Django,这意味着重写许多隐式导入并更改设置文件中的许多配置变量。

另一个问题是Python打包产生的版本的一致性。如果允许其他团队成员创建

在分发应用程序时,尤其是在进行大量工作时,确保此过程发生在同一个可复制环境中非常重要。

预处理多个资产时。即使使用相同的代码库来创建包,在两个不同环境中创建的包也可能如下所示:

错误的。这可能是由于构建过程中使用了不同版本的工具造成的。最佳实践是将分配责任更改为:

提供持续集成/交付系统,例如Jenkins 和Buildbot。另一个好处是该套餐

发货前通过了所有必需的测试。您还可以将部署自动化作为此持续交付系统的一部分。

尽管如此,使用setuptools 将代码作为Python 包分发并不容易或轻松。它会很大

这非常值得一试,因为它极大地简化了部署。请注意,这也符合十二因素应用的规则6。

详细建议:将您的应用程序作为一个或多个无状态进程运行。

#Python大师编程系列154:创建自己的包索引或索引镜像以上有关内容源网络的信息仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92522.html

Like (0)
CSDN的头像CSDN
Previous 2024年6月27日
Next 2024年6月27日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注