包签名

警告

包签名插件处于预览阶段。有关更多信息,请参阅Conan 稳定性部分。

此插件必须位于缓存的extensions/plugins/sign/sign.py文件中,包含 2 个方法

  • sign(ref, artifacts_folder, signature_folder, **kwargs)会为每个要上传到服务器的食谱和包执行。ref是工件的完整引用,可以是食谱引用或包引用。artifacts_folder是包含要上传的文件的文件夹,通常是conanfile.pyconan_package.tgzconanmanifest.txt等。signature_folder包含应写入生成文件的文件夹。

  • verify(ref, artifacts_folder, signature_folder, files, **kwargs)在从服务器安装包时执行,接收与上述相同的参数,应用于验证签名的完整性或正确性。files是已下载文件的可迭代对象,因为当包正在安装时,此函数可能会被调用两次:首先,安装食谱,verify()将使用食谱文件(即conanfile.pyconandata.yml等)调用。但是,当从源构建包时,导出的conan_sources.tgz文件也可能被下载,并且verify()函数将再次被调用,这次files参数只包含conan_sources.tgz

一个包签名器的示例,当包上传时,它将工件文件名放入一个名为signature.asc的文件中,并断言下载的工件位于已下载的signature.asc

import os

def sign(ref, artifacts_folder, signature_folder, **kwargs):
    print("Signing ref: ", ref)
    print("Signing folder: ", artifacts_folder)
    files = []
    for f in sorted(os.listdir(artifacts_folder)):
        if os.path.isfile(os.path.join(artifacts_folder, f)):
            files.append(f)
    signature = os.path.join(signature_folder, "signature.asc")
    open(signature, "w").write("\n".join(files))

def verify(ref, artifacts_folder, signature_folder, files, **kwargs):
    print("Verifying ref: ", ref)
    print("Verifying folder: ", artifacts_folder)
    signature = os.path.join(signature_folder, "signature.asc")
    contents = open(signature).read()
    print("verifying contents", contents)
    for f in files:
        print("VERIFYING ", f)
        if os.path.isfile(os.path.join(artifacts_folder, f)):
            assert f in contents

请注意,**kwargs参数对于避免未来添加新参数而导致插件损坏的情况非常重要,请务必将其添加到您的方法中。