运行和输出

来自配方的输出文本

使用 self.output 属性从配方输出文本。不要使用 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 在打印错误或与任何给定模式匹配的标记警告时引发异常。这有助于确保配方不会打印意外的警告或错误。此外,您可以跳过哪些警告触发异常 使用 *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 值来匹配任何没有标签的警告。

要标记警告,请在配方中使用 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() 将不会打印要执行的命令。

使用 stdoutstderr 参数将命令的输出重定向到类文件对象而不是控制台。

# 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)