如何为不同的 clang 格式版本维护 .clang 格式文件?
How to maintain a .clang-format file for different clang-format versions?
这个问题延伸 Unify output with different clang-format versions。问题是 clang-format 的默认行为因版本而异,即使是内置样式也是如此。坦率地说,我想问为什么开发人员不关心这里的兼容性,但那不是重点。事已至此,我必须处理。我不允许要求特定版本的 clang-format(就像相关答案中建议的一位用户)并且需要配置 clang-format 以便它为不同版本提供相同的结果。如果可能,版本 >= 4.0 应该被覆盖。如果这不可行,可以接受适用于 >= minimum_version 版本的解决方案。
我想可以为每个 clang 格式版本找到一个配置,以提供所需的输出——繁琐的工作,但至少它是一个解决方案。但是对不同版本使用相同的 .clang-format 文件会产生一些问题,因为较新的密钥对旧版本来说是未知的。所以一个人需要
- 一个 clang 格式的开关,如果它们是未知的则跳过键
- 一种将附加选项传递给 clang-format 的方法(除了文件中给出的选项)
- 一种为给定的 clang 格式版本指定配置文件的方法
- 一个很好的方法来完成上面的一个(不确定这里提供的 clang-format 是什么)
有什么想法吗?
由于这已经开放了一段时间并且没有人尝试回答,我将根据我有限的经验尝试投入我的 2 美分。
我怀疑这个问题这么长时间都没有得到解答的原因是你真的做不到,而唯一的真正解决方案是强制每个人都使用相同版本的 clang-format。与此同时,您可以尝试以下几个想法:
1) 如果你不能强制所有人都升级到最新版本,你是否可以强制降级到 common/minimum 版本并使用它?
2) 你能接受每个人都在他们的本地机器上使用他们的 clang-format 版本,只格式化他们接触的行,并且有一个 CI 工作自动更新格式到 "canonical" 每次提交后的版本?
3) 你可以尝试只使用最低版本支持的功能,并为每个更高版本创建一个单独的配置文件,不要依赖任何默认值或默认样式之一设置的值,而是设置每个可手动配置的选项。但是,这可能不会长期有效,特别是如果有贡献者总是热衷于使用 clang-format 开发分支的负责人。
最后,我真正考虑的唯一选择是,除了强制每个人都更新到特定版本的 clang-format 之外:
4) 围绕 clang-format 编写一个包装器,让每个人都使用它。我假设您的 none 开发人员被锁定在 运行 您在他们的开发机器上生成的实际代码之外,或者您至少有一种 tool/scripting 语言可以 运行 代码共享给所有开发者?然后只需使用您已有的 production/tool 脚本语言之一,围绕 clang-format 编写包装器。将所有输入(命令行参数、标准输入、上传任何引用的文件等)转发到服务器 运行 使用正确的配置配置您的 "actual" clang-format 实例,让它进行格式化,然后转发所有输出(stdout、stderr、任何修改文件的内容、return 代码等)返回到包装器,并让它在本地机器上复制更改。如果做得足够好,没有 tools/IDEs/etc 与 clang-format 集成应该能够分辨出区别。根据需要,将足够多的这些 clang 格式服务器实例化到离您的开发人员足够近的位置,以处理任何延迟问题和峰值使用 cpu/network 负载 - 每个办公室有一个服务器或几个服务器,甚至可能是一个小的、低的实例每台开发人员机器上的内存占用 linux 服务器虚拟机。也许让服务器自动获取新版本的 clang-format 和配置。是的,与原生的 运行ning clang-format 相比会有更多的延迟,但我认为这是您在您的情况下可以做的最好的,并且具有 每个人 的额外好处保持不变,最新,您可以 change/configure 随意使用的 clang-format 版本,而不必担心将更改推送给每个贡献者以及他们可能存在的任何限制在他们的机器上。
这个问题延伸 Unify output with different clang-format versions。问题是 clang-format 的默认行为因版本而异,即使是内置样式也是如此。坦率地说,我想问为什么开发人员不关心这里的兼容性,但那不是重点。事已至此,我必须处理。我不允许要求特定版本的 clang-format(就像相关答案中建议的一位用户)并且需要配置 clang-format 以便它为不同版本提供相同的结果。如果可能,版本 >= 4.0 应该被覆盖。如果这不可行,可以接受适用于 >= minimum_version 版本的解决方案。
我想可以为每个 clang 格式版本找到一个配置,以提供所需的输出——繁琐的工作,但至少它是一个解决方案。但是对不同版本使用相同的 .clang-format 文件会产生一些问题,因为较新的密钥对旧版本来说是未知的。所以一个人需要
- 一个 clang 格式的开关,如果它们是未知的则跳过键
- 一种将附加选项传递给 clang-format 的方法(除了文件中给出的选项)
- 一种为给定的 clang 格式版本指定配置文件的方法
- 一个很好的方法来完成上面的一个(不确定这里提供的 clang-format 是什么)
有什么想法吗?
由于这已经开放了一段时间并且没有人尝试回答,我将根据我有限的经验尝试投入我的 2 美分。
我怀疑这个问题这么长时间都没有得到解答的原因是你真的做不到,而唯一的真正解决方案是强制每个人都使用相同版本的 clang-format。与此同时,您可以尝试以下几个想法:
1) 如果你不能强制所有人都升级到最新版本,你是否可以强制降级到 common/minimum 版本并使用它?
2) 你能接受每个人都在他们的本地机器上使用他们的 clang-format 版本,只格式化他们接触的行,并且有一个 CI 工作自动更新格式到 "canonical" 每次提交后的版本?
3) 你可以尝试只使用最低版本支持的功能,并为每个更高版本创建一个单独的配置文件,不要依赖任何默认值或默认样式之一设置的值,而是设置每个可手动配置的选项。但是,这可能不会长期有效,特别是如果有贡献者总是热衷于使用 clang-format 开发分支的负责人。
最后,我真正考虑的唯一选择是,除了强制每个人都更新到特定版本的 clang-format 之外:
4) 围绕 clang-format 编写一个包装器,让每个人都使用它。我假设您的 none 开发人员被锁定在 运行 您在他们的开发机器上生成的实际代码之外,或者您至少有一种 tool/scripting 语言可以 运行 代码共享给所有开发者?然后只需使用您已有的 production/tool 脚本语言之一,围绕 clang-format 编写包装器。将所有输入(命令行参数、标准输入、上传任何引用的文件等)转发到服务器 运行 使用正确的配置配置您的 "actual" clang-format 实例,让它进行格式化,然后转发所有输出(stdout、stderr、任何修改文件的内容、return 代码等)返回到包装器,并让它在本地机器上复制更改。如果做得足够好,没有 tools/IDEs/etc 与 clang-format 集成应该能够分辨出区别。根据需要,将足够多的这些 clang 格式服务器实例化到离您的开发人员足够近的位置,以处理任何延迟问题和峰值使用 cpu/network 负载 - 每个办公室有一个服务器或几个服务器,甚至可能是一个小的、低的实例每台开发人员机器上的内存占用 linux 服务器虚拟机。也许让服务器自动获取新版本的 clang-format 和配置。是的,与原生的 运行ning clang-format 相比会有更多的延迟,但我认为这是您在您的情况下可以做的最好的,并且具有 每个人 的额外好处保持不变,最新,您可以 change/configure 随意使用的 clang-format 版本,而不必担心将更改推送给每个贡献者以及他们可能存在的任何限制在他们的机器上。