【问题标题】:How to dynamically handle UNIX/Windows directory separators in yaml files如何动态处理 yaml 文件中的 UNIX/Windows 目录分隔符
【发布时间】:2017-03-09 09:00:08
【问题描述】:

我们面临一个问题,我们需要在我们的config-file.yml 之一中配置路径。它是 CLI 脚本的路径。我们面临 UNIX/Windows - / - \ 的一个古老的已知问题“目录分隔符”。现在我们只想为两个操作系统配置一个路径。

目前我们需要根据当前使用的操作系统手动切换路径。这一直破坏我们的 VCS 处理/应用程序稳定性。

Unix

bin_path: path/to/script

窗口

bin_path: path\to\script

有没有类似于 PHP superglobal DIRECTORY_SEPARATOR 的占位符?我们专注于不需要替换脚本中分隔符的解决方案。在使用 yaml 文件时,我曾多次遇到这个问题。

【问题讨论】:

  • Windows 上的 unix 符号处理不正确吗?
  • php.net/manual/en/function.realpath.php 读取:在 windows 上 realpath() 会将 unix 样式路径更改为 windows 样式。
  • @AlexBlex 是的,但在这种情况下不是。该命令由 symfony.com/doc/current/components/process.html 触发,它使用 unix 分隔符在 Windows 上中断。
  • 在将文件名传递给组件之前,是什么阻止了 realpath 文件名?
  • 现在什么都没有。但是有没有不接触脚本端路径的解决方案?

标签: php configuration path yaml


【解决方案1】:

YAML 是一种数据描述语言,因此不支持从外部流入 YAML 文档的数据(即您可以在文档中使用的变量)。理论上你唯一能做的就是以一种让你在之后选择你真正想要的值的方式来构建你的 YAML 文档。示例:

bin_path:
  unix: path/to/script
  windows: path\to\script

然后,在加载文件时,可以为当前操作系统选择合适的路径。但是,与在 Windows 上简单地将 / 替换为 \ 的方法相比,这似乎令人费解。


另一种解决方案是只使用为 Windows 或 UNIX 配置的一个路径,如下例所示。这样您就不需要为每个操作系统配置特定的路径。

bin_path: path/to/script

在例如PHP 你可以使用realpath 在你的应用程序中规范化你的通行证。

realpath('path/to/script'); //creates an absolute path including OS based directory separators

【讨论】:

  • 还请添加使用脚本替换目录分隔符或在 PHP 案例中使用 realpath 的解决方案。我将把这个答案标记为正确。该死的基于文本的配置文件,无需访问编程逻辑。像 yaml 解析器这样提供在配置文件中插入脚本逻辑的能力的想法会很好。我可能会写一个并在 GitHub 上分享。
  • 在使用不依赖于操作系统(PHP、node.js、Java 等)的编程语言的情况下,必须具备在不使用内部软件开关的情况下配置系统的能力应用逻辑。
  • 我不会给你一个 PHP 解决方案,因为 a) 你没有提供你现有的 PHP 代码 b) 我真的不太了解 PHP。但是,您可能对使用某种模板语言预处理 YAML 文件之类的事情感兴趣,例如 Ansible 或 Saltstack 使用 Jinja 执行此操作。这样,您可以先通过执行模板将变量插入到 YAML 文件中,然后读取生成的 YAML。
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多