创建扩展包
创建扩展包
介绍
对于 Masonite 而言,创建扩展包非常简单。您创建一个包并推到 PyPi 上用不了5分钟。使用 Masonite 软件包,您可以轻松地轻松集成和构建所有 Masonite 项目。 Masonite 附带了一些辅助功能,以创建可以添加配置文件,路由,控制器,视图,命令,迁移等的扩展包。
开始
作为开发人员,您可能负责制作扩展包和使用扩展包。在本文档中,我们将同时讨论两者。我们首先讨论如何制作扩展包,然后再讨论如何使用该扩展包或其他第三方包。
Masonite 作为一个 Python 框架,显然可以利用非为特定框架设计的所有 Python 扩展包。例如,Masonite 显然可以使用诸如请求之类的库,但不能使用 Django Rest Framework。
与为 Django 构建 Django Rest Framework 的方式类似,您还可以构建特定于 Masonite的扩展包。您也不需要为特定某个项目进行构建。您可以轻松地构建一个可以用于任何Python 项目的包,使用服务提供者将其直接连接到 Masonite 。稍后我们将详细讨论。
有关扩展包
Masonite 使用了几个关键功能来创建应用程序。这些主要包括:路由,控制器,视图,迁移和 craft 命令。创建一个包很简单。为了方便地创建所有这些功能,Masonite 附带了一些辅助功能。
您可以轻松创建类似craft mypackage:install
的命令,并且可以搭建控制器并将控制器,路由等安装到 Masonite 项目中。您还可以使用 publish 命令,类似于 craft publish YourServiceProvider
。在功能方面确实没有太大区别,但是 install 命令要求您手动将内容复制到它们需要去的地方,而内置的 publish
命令可解决这些问题。
您不必使用此功能,而是让开发人员从您的文档中复制并粘贴他们需要的内容,但是拥有良好的设置过程是提高开发人员快速开发,而这正是Masonite的目的。
创建一个包
创建包的最佳方法是下载 Masonite Starter Package Repo.
只需转到存储库并下载相应的zip文件即可。简单地git clone它没有什么好处,因为您将会根据自己的需求创建自己的存储库,而克隆存储库仍会跟踪当时的入门包。
下载后,您可以将其解压在您的服务器的任何位置。从那里您需要创建一个虚拟环境并运行测试:
创建虚拟环境
$ python3 -m venv venv
激活虚拟环境
在Mac和Linux上激活虚拟环境很简单:
$ source venv/bin/activate
或者,如果您使用的是Windows:
$ ./venv/Scripts/activate
安装要求
现在,您可以安装一些开发pypi软件包来帮助您进行软件包开发,例如 flake8
和 pytest
.
入门包附带一个make文件,可帮助您更快地入门。运行:
$ make init
这将安装Craft CLI工具以及其他一些要求软件包。
运行测试
现在,您可以运行测试以确保一切正常:
$ python -m pytest
您应该看到所有基本设置测试都通过了。现在,您可以开始TDD流程或开始围绕您的软件包构建测试。
测试套件是Masonite完整测试套件,确保阅读了测试文档。
构建一个安装命令
首先我们来学习如何构建一个简单的安装命令。这里将展示如何将文件手动放置到正确位置。然后,我们将学习如何使用publish
命令来自动完成一些工作。你可以直接跳过去看你所关心的内容。
为项目增加craft命令能方便开发者更高效用你的提供的包。你可以访问创建命令文档学习如何创建一个命令。它只涉及一个普通类和一个Service Provider。
访问文档后跟着创建一个InstallCommand
和InstallProvider
。几分钟应该就可以完成了。一旦完成后,我们就可以继续为我们的包添加辅助函数。
记住你现在应该可以使用craft命令,所以你可以进行类似如下操作:
$ craft command Install
$ craft provider Package
你需要将命令放置在src/package
目录,这样防止开放过程中写过多代码。
只需将生成的文件放入src/package/commands
和src/package/providers
目录。如果目录不存在你需要手动创建。
加入迁移目录
Masonite包允许你在项目中加入迁移。例如,你可以加入package_subscriptions
表来支撑构建Stripe支付功能。
在Service Provider中可以将我们的目录进行注册。
import os
from masonite.provider import ServiceProvider
package_directory = os.path.dirname(os.path.realpath(__file__))
class PackageProvider(ServiceProvider):
def register(self):
self.app.bind(
'PackageMigrationDirectory',
os.path.join(package_directory, '../migrations')
)
Masonite将会操作所有以MigrationDirectory
命名的键,将它将入到迁移列表中。在我们执行craft migrate
以及craft migrate:*
命令时执行。当你执行迁移命令时,你将会看到类似如下内容:
Migrating: databases/migrations
Migrating: /Users/joseph/Programming/packages/starter/src/package/providers/../migrations
[OK] Migrated 2019_12_31_041847_create_package_table
注意到这里执行后会从多个目录进行迁移。这是为包实现迁移的最佳途径。
package_directory
变量存放了到当前文件目录的绝对路径,../migrations
意味着上级的migrations目录。
包助手
一些包助手可以用来集成到包里。现在我们需要将masonite.package
辅助函数到我们install命令。提供给create_or_append_config()
函数的路径必须是到我们包里的绝对路径。
让我们来创建一个基本的配置文件,然后让安装命令拷贝它。让我们键一个简单的文件src/package/snippets/configs/services.py
"""配置文件"""
DRIVER = 'service1'
Masonite放置了一个package_directory
变量在这。我们的安装命令的handle方法内部看起来类似如下:
import os
from cleo import Command
from masonite.packages import create_or_append_config
package_directory = os.path.dirname(os.path.realpath(__file__))
class InstallCommand(Command):
"""
Installs needed configuration files into a Masonite project
package:install
"""
def handle(self):
create_or_append_config(
os.path.join(
package_directory,
'../snippets/configs/services.py'
)
)
现在如果你执行安装命令,它会将config/services.py
文件内配置追加。
*确保该命令有加入到Service Provider里,并且开发者有将包加入到
PROVIDERS
列表。详情参考 创建命令 文档。
这将创建和包配置文件同名的配置文件。本例我们创建和支架的文件为config/services.py
,因为我们的包文件为services.py
。如果我们想变更其他文字的话组需要修改包配置文件名。
使用我们的包
我们可以本地进行包测试,或者创建包到PyPi。
要在本地测试我们的软件包,如果使用虚拟环境,只需要进入到要使用该包的Masonite项目里激活虚拟环境,然后进入到该包目录执行:
$ pip install .
如果做了更改你需要卸载并重装改包,使用如下命令:
$ pip uninstall your-package && pip install .
这将在你的虚拟环境中安装你的新包。回到项目的根目录,我们执行craft package:install
命令。执行完该命令后我们就有了config/services.py
新配置文件。
上传到 PyPi
现在我们已经有了一个已经测试安装好的包了,并且很好的可以集成到已有的Masonite应用中。现在,是时候将它上传到PyPI以便其他人可以安装它了。
我们可以通过make命令很容易实现。
.pypirc 文件
如果你想将包分享到PyPI,这之前你你需要在home目录下创建一个.pypirc文件。
如果你还有没有创建的话可以执行如下命令:
make pypirc
它会将文件移动到home目录下。如果使用的windows话你需要手动操作。
确保编辑了setup.py
文件配置好所有的包配置项。文件里有足够的注释信息来让你了解所配置的项目。
一旦配置好了setup.py文件,你就可以执行如下命令:
$ make publish
执行该命令后它首先会判断是否安装twine,如果没有它会自动完成安装,然后构建包,上传到PyPI,最后删除不需要的资源。
简单吧?
安装包
现在你的包已经在PyPI了,我仅需要执行:
$ pip install super-awesome-package
然后加入到Service Provider到PROVIDERS
列表:
from package.providers.InstallProvider import InstallProvider
PROVIDERS = [
...
# New Provider
InstallProvider,
]
然后执行:
$ craft package:install
注意我们的Service Provider会自动加命令加入到craft。
同样,不是所有的包或者命令都需要安装。这个需要开发者根据自身需求选择。
你可以通过包作者所提供的软件安装文档来了解实际是否自己所需。
发布
Masonite具有发布软件包的概念。这使您更加无缝将masonite和包继承。发布使Masonite应用中加入类似路由,视图,迁移和命令更加容易。所有这些都是通过Service Provider处理。
只需执行:
$ craft publish YourProvider
这里是你需要命令的Provider类。
你的Masonite应用就会包含所有所需的资源。
发布文件
你可以创建或者追加任意文件到Masonite应用。可以是命令,路由,配置文件等等。
例如,你的包目录结构类似如下:
validation/
providers/
ValidationProvider.py
commands/
RuleCommand.py
setup.py
在Service Provider内部我们可以这么做:
import os
class ValidationProvider(ServiceProvider):
wsgi = False
def register(self):
pass
def boot(self):
command_path = os.path.join(os.path.dirname(__file__), '../commands')
self.publishes({
os.path.join(command_path, 'RuleCommand.py'): 'app/commands/RuleCommand.py'
})
注意我们命令目录放置在上级的commands
目录下。我们然后将目录组合RuleCommand.py
文件然后通知Masonite将文件放置在用的app/commands/RuleCommand.py
模块中。
使用了该包的用户就会在它的应用中装上该命令了!
发布迁移
你可以放置任何迁移在包里,将它们发布到Masonite应用的migration目录下。如果您想让一些开发人员在自定义迁移之前对其进行编辑时非常有用。
例如,假设你的包目录结构如下:
validation/
providers/
ValidationProvider.py
migrations/
user_migration.py
team_migration.py
setup.py
迁移目录下的user_migration.py
应该是万振的迁移文件。
Service Provider类似如下:
import os
def boot(self):
migration_path = os.path.join(os.path.dirname(__file__), '../migrations')
self.publishes_migrations([
os.path.join(migration_path, 'user_migration.py'),
os.path.join(migration_path, 'team_migration.py'),
])
这将在用户目录下创建一个新的迁移。
发布标签
您还可以为每个迁移添加标签。例如,如果您有两组迁移,可以如下操作:
import os
def boot(self):
migration_path = os.path.join(os.path.dirname(__file__), '../migrations')
command_path = os.path.join(os.path.dirname(__file__), '../commands')
self.publishes({
os.path.join(command_path, 'RuleCommand.py'): 'app/commands/RuleCommand.py'
}, tag="commands")
self.publishes_migrations([
os.path.join(migration_path, 'user_migration.py'),
os.path.join(migration_path, 'team_migration.py'),
], tag="migrations")
现在用户可以通过--tag
选项发布迁移或者命令时。
$ craft publish ValidationProvider --tag migrations
这将忽略掉commands标签发布,只应用migrations标签发布。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。