本文档翻译自:https://docs.conan.io/en/latest/creating_packages/package_repo.html#capturing-the-remote-and-commit-scm
    :::success Waring**
    这是一项实验性功能,可能会在将来的版本中发生重大更改。 尽管这是实验性功能,但使用scm_to_conandata的功能被认为是稳定的。 :::

    你可以将 scm 属性的 urlrevision 字段设置为auto。当您导出配方时 (或在调用 conan create 时),导出的配方将捕获本地存储库的远程和提交:

    1. import os
    2. from conans import ConanFile, CMake, tools
    3. class HelloConan(ConanFile):
    4. scm = {
    5. "type": "git", # Use "type": "svn", if local repo is managed using SVN
    6. "subfolder": "hello",
    7. "url": "auto",
    8. "revision": "auto",
    9. "password": os.environ.get("SECRET", None)
    10. }
    11. ...

    您可以将conanfile.py提交并推送到原始存储库,该存储库将始终保留auto值。当文件导出到Conan本地缓存时 (除非您有未提交的更改,请阅读下文),这些数据将存储在 conanfile.py 本身 (Conan将修改文件) 或在一个特殊的文件conandata.yml并与配方一起存储,具体取决于配置参数scm_to_conandata的值。

    • 如果未激活 scm_to_conandata (Conan v1.x中的默认行为),则Conan将存储conanfile.py的修改版本,其中字段的值为纯文本:

      1. import os
      2. from conans import ConanFile, CMake, tools
      3. class HelloConan(ConanFile):
      4. scm = {
      5. "type": "git",
      6. "subfolder": "hello",
      7. "url": "https://github.com/conan-io/hello.git",
      8. "revision": "437676e15da7090a1368255097f51b1a470905a0",
      9. "password": "MY_SECRET"
      10. }
      11. ...

      因此,当您将配方上传到Conan远程服务器时,配方将包含 “已解决” 的URL并提交。

    • 如果scm_to_conandata被激活,这些字段的值 (usernamepassword除外) 将存储在conandata.yml文件中,该文件将与配方一起自动导出。

    无论您选择哪个选项,Conan都会在加载配方文件时将解析的数据分配到相应的字段,并且它们可用于配方中定义的所有方法。此外,如果从源代码构建包,Conan将在运行方法source() (如果已定义) 之前获取捕获的url/commit中的代码。
    由于SCM属性是在本地目录上下文中求值的 (请参阅scm属性),因此您可以编写更复杂的函数来检索适当的值,此源文件conanfile.py也将有效:

    1. import os
    2. from conans import ConanFile, CMake, tools
    3. def get_remote_url():
    4. """ Get remote url regardless of the cloned directory """
    5. here = os.path.dirname(__file__)
    6. svn = tools.SVN(here)
    7. return svn.get_remote_url()
    8. class HelloConan(ConanFile):
    9. scm = {
    10. "type": "svn",
    11. "subfolder": "hello",
    12. "url": get_remote_url(),
    13. "revision": "auto"
    14. }
    15. ...

    :::info Tip
    在执行conan createconan export时,Conan将在本地缓存中捕获本地scm项目文件夹的源。
    这允许构建包对源代码进行更改,而无需提交它们并将它们推送到远程存储库。从本地存储库克隆时,这便于加快包的开发。

    因此,如果您正在使用scm功能,带有一些用于url和/或 revison 的auto字段,并且您在存储库中有未提交的更改,则会打印一条警告消息:

    1. $ conan export . hello/0.1@demo/testing
    2. hello/0.1@demo/testing: WARN: There are uncommitted changes, skipping the replacement of 'scm.url'
    3. and 'scm.revision' auto fields. Use --ignore-dirty to force it.
    4. The 'conan upload' command will prevent uploading recipes with 'auto' values in these fields.

    正如警告消息所解释的那样,除非您指定 --ignore-dirty,否则将不会替换 auto 字段,并且默认情况下,conan upload 将阻止配方的上传。这可以防止上传的配方输出错误的scm值。您可以使用 conan upload --force 强制上传配方,但 auto 值未替换。 :::