加载集合¶
Invoke 执行模型的核心涉及一个或多个 Collection 对象。虽然这些对象可以通过编程方式创建,但在典型使用中,Invoke 会从它找到或被告知使用的 Python 模块中为你创建它们。
任务模块的发现¶
在没有其他配置的情况下,简单地调用 invoke
会查找名为 tasks
的单个 Python 模块或包,并将其视为根命名空间。tasks
(或通过 加载配置选项 提供的任何其他名称)会通过以下方式搜索:
首先,如果 Python 的 sys.path 上已经存在一个有效的同名任务模块,则不再进行更多搜索——该模块被选中。
如果找不到,则从用户的当前工作目录(os.getcwd)开始,向本地文件系统的根目录搜索,并尝试将每个目录临时添加到
sys.path
后再次导入。由于 Python 的导入机制的工作方式,这种方法总是优先选择包目录(包含
__init__.py
的tasks/
)而不是同一位置的模块文件(tasks.py
)。如果找到候选模块并成功导入,其父目录将在 Python 会话的其余部分**保留**在
sys.path
上——这使得任务代码可以方便地假设兄弟模块的可导入性。
候选模块/包会被内省以确保它们实际上可以作为有效的任务集合使用。任何失败的模块都会被丢弃,导入它们时对 sys.path
的修改会被撤销,搜索继续。
配置加载过程¶
你可以配置上述行为,要求 Invoke 更改搜索的集合名称和/或文件系统级加载开始查找的路径。
例如,你可能已经有一个项目级的 tasks.py
,无法轻易重命名;或者你可能希望托管存储在项目根目录之外的多个任务集合,并方便地在它们之间切换;或者任何其他原因。
可以通过 配置文件选项 或 运行时 CLI 标志 指定要搜索的集合名称和搜索根目录:
更改集合名称:设置
tasks.collection_name
配置选项,或使用--collection
。它应该是一个 Python 模块名称,而不是文件名(因此是mytasks
,而不是mytasks.py
或mytasks/
。)更改根搜索路径:配置
tasks.search_root
或使用--search-root
。该值可以是任何有效的目录路径。