包签名¶
警告
包签名插件仍处于预览阶段。有关更多信息,请参阅Conan 稳定性部分。
此插件必须位于缓存的 extensions/plugins/sign/sign.py 文件中,包含 2 个方法。
当要上传到服务器的每个配方和包被处理时,会执行
sign(ref, artifacts_folder, signature_folder, **kwargs)方法。ref是工件的完整引用,可以是配方引用或包引用。artifacts_folder是包含要上传文件的文件夹,通常是conanfile.py、conan_package.tgz、conanmanifest.txt等。signature_folder包含应将生成的文件写入的文件夹。当从服务器安装包时,会执行
verify(ref, artifacts_folder, signature_folder, files, **kwargs)方法。它接收与上面相同的参数,并应用于验证签名的完整性或正确性。files是可迭代的下载文件,因为当包被安装时,此函数可能会被调用两次:首先,配方被安装,并且verify()将与配方文件(即conanfile.py、conandata.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 参数很重要,可以避免未来版本添加新参数而导致插件中断,请确保将其添加到您的方法中。