加载集合

Invoke 执行模型的核心涉及一个或多个 Collection 对象。虽然这些对象可以通过编程方式创建,但在典型使用中,Invoke 会从它找到或被告知使用的 Python 模块中为你创建它们。

任务模块的发现

在没有其他配置的情况下,简单地调用 invoke 会查找名为 tasks 的单个 Python 模块或包,并将其视为根命名空间。tasks (或通过 加载配置选项 提供的任何其他名称)会通过以下方式搜索:

  • 首先,如果 Python 的 sys.path 上已经存在一个有效的同名任务模块,则不再进行更多搜索——该模块被选中。

  • 如果找不到,则从用户的当前工作目录(os.getcwd)开始,向本地文件系统的根目录搜索,并尝试将每个目录临时添加到 sys.path 后再次导入。

    • 由于 Python 的导入机制的工作方式,这种方法总是优先选择包目录(包含 __init__.pytasks/)而不是同一位置的模块文件(tasks.py)。

    • 如果找到候选模块并成功导入,其父目录将在 Python 会话的其余部分**保留**在 sys.path 上——这使得任务代码可以方便地假设兄弟模块的可导入性。

候选模块/包会被内省以确保它们实际上可以作为有效的任务集合使用。任何失败的模块都会被丢弃,导入它们时对 sys.path 的修改会被撤销,搜索继续。

配置加载过程

你可以配置上述行为,要求 Invoke 更改搜索的集合名称和/或文件系统级加载开始查找的路径。

例如,你可能已经有一个项目级的 tasks.py,无法轻易重命名;或者你可能希望托管存储在项目根目录之外的多个任务集合,并方便地在它们之间切换;或者任何其他原因。

可以通过 配置文件选项运行时 CLI 标志 指定要搜索的集合名称和搜索根目录:

  • 更改集合名称:设置 tasks.collection_name 配置选项,或使用 --collection。它应该是一个 Python 模块名称,而不是文件名(因此是 mytasks,而不是 mytasks.pymytasks/。)

  • 更改根搜索路径:配置 tasks.search_root 或使用 --search-root。该值可以是任何有效的目录路径。