运行和输出¶
从 recipes 输出文本¶
使用 self.output
属性从 recipes 输出文本。不要使用 Python 的 print()
函数。self.output
属性有以下方法来表示打印消息的级别
trace(msg)
debug(msg)
verbose(msg)
status(msg)
info(msg)
highlight(msg)
success(msg)
warning(msg, warn_tag=None)
error(msg)
这些输出函数只有在使用 Conan 启动时设置的详细级别等于或高于消息级别时才会输出。因此,使用 -vwarning
运行会输出对 warning()
和 error()
的调用,但不会输出 info()
。(此外,highlight()
和 success()
方法具有 -vnotice
详细级别)
请注意,这些方法会再次返回输出对象,因此如果需要,您可以链式调用输出。
使用 core:warnings_as_errors
conf,您可以使 Conan 在打印任何与给定模式匹配的错误或标记警告时引发异常。这对于确保 recipes 不会打印意外的警告或错误很有用。此外,您可以跳过哪些警告触发异常 使用 *core:skip_warnings* conf。
# Raise an exception if any warning or error is printed
core:warnings_as_errors=['*']
# But skip the deprecation warnings
core:skip_warnings=['deprecated']
这两个 conf 都接受一个模式列表,用于匹配警告标签。一个特殊的 unknown
值可用于匹配任何没有标签的警告。
要标记警告,请在您的 recipes 中使用 warning()
方法的 warn_tag
参数
self.output.warning("Extra warning", warn_tag="custom_tag")
从最不具体到最具体,这些函数的常见用法是
- error(msg):
表示发生了严重的导致系统或应用程序无法继续正常运行的问题。 通常,这表示执行正常流程中的失败,例如服务崩溃或关键异常。
- warning(msg, warn_tag=None):
突出显示一个潜在问题,该问题虽然不会停止系统,但可能会在将来或在特定条件下引起问题。 警告表示应进行审查但不一定导致操作立即停止的异常情况。
- success(msg):
表示已成功完成操作。 这种类型的消息对于确认关键流程或任务已正确完成很有用,这对于良好的应用程序监控至关重要。
- highlight(msg):
标记或强调需要突出显示但不一定表示成功或错误的重要的事件或过程。 这些消息引起对可能与用户或管理员相关的关键点的注意。
- info(msg):
提供有关系统或正在进行的操作的常规信息。 信息消息是基本的,用于通知常见事件,例如流程的开始或完成,而不暗示特定问题或成就。
- status(msg):
报告系统或正在进行的操作的当前状态。 状态消息提供有关某项工作原理的更新,通常是实时的,以提供流程的进度或情况的清晰视图。
以下三种方法默认情况下不显示,通常保留给需要更高详细程度的方案。 您可以使用参数 -v
、-vv
和 -vvv
分别显示它们。
- verbose(msg):
显示额外的详细信息,虽然不重要,但对于更好地了解系统的工作方式很有用。 适合在不过多细节地过度加载日志的情况下获得更多上下文。 当需要比简单信息更清晰时很有用。
- debug(msg):
具有高细节级别,主要用于调试代码。 这些消息为开发人员提供有用的信息,例如变量值或执行流程详细信息,以跟踪错误或分析程序的行为。
- trace(msg):
这是最极端的细节级别。 跟踪消息记录系统采取的每个小步骤,包括函数条目和退出,变量更改和其他非常具体的事件。 当需要完全了解系统中发生的一切时使用,但由于它可能生成大量信息,因此应谨慎使用。
运行命令¶
run(self, command, stdout=None, cwd=None, ignore_errors=False, env="", quiet=False, shell=True, scope="build", stderr=None)
self.run()
是一个辅助函数,用于运行系统命令,同时注入调用以激活适当的环境,并在发生错误时抛出异常,以使命令错误不会被忽视。 它还使用 命令包装器插件 的结果包装命令。
command
应该被指定为一个字符串,并传递给系统 shell。当参数
quiet
设置为 true 时,self.run()
的调用将不会打印要执行的命令。
使用 stdout
和 stderr
参数将命令的输出重定向到类似文件的对象,而不是控制台。
# Redirect stdout to a file
with open("ninja_stdout.log", "w") as stdout:
# Redirect stderr to a StringIO object to be able to read it later
stderr = StringIO()
self.run("ninja ...", stdout=stdout, stderr=stderr)