代码预处理(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