php小编香蕉介绍:在进行编辑时,保留单引号是一个重要的技巧。在YAML文件中,使用单引号可以确保文本内容被原样保留,不会受到解析器的解释。这种方式可以避免特殊字符或者特定格式的数据出现错误,确保文件内容的准确性和完整性。无论是处理配置文件还是编写代码,保留单引号都是一个很好的习惯,能够帮助我们更好地管理和维护代码。
问题内容
我想编辑 YAML 文件中某些键的值,同时保持其余键不变。我编写了一个片段来为这些键插入一些值,但生成的新文件不维护单引号 ('
)。如何避免这种情况?
我的代码:
func updateVariables(nameValue, nameCluster string) error {
yamlFile, err := os.ReadFile("path")
if err != nil {
return fmt.Errorf("Error reading YAML file: %v", err)
}
var config PipelineConfig
err = yaml.Unmarshal(yamlFile, &config)
if err != nil {
return fmt.Errorf("Error parsing YAML file: %v", err)
}
for i := range config.Variables {
switch config.Variables[i].Name {
case "app_name":
config.Variables[i].Value = nameValue
case "cluster_name":
config.Variables[i].Value = nameCluster
}
}
modifiedYAML, err := yaml.Marshal(&config,)
if err != nil {
return fmt.Errorf("Error converting structure to YAML: %v", err)
}
err = os.WriteFile("path", modifiedYAML, 0644)
if err != nil {
return fmt.Errorf("Error writing modified YAML file: %v", err)
}
fmt.Println("File YAML modified.")
return nil
}
登录后复制
我的结构:
type PipelineConfig struct {
Trigger string `yaml:"trigger"`
Variables []struct {
Name string `yaml:"name"`
Value string `yaml:"value"`
} `yaml:"variables"`
Stages []struct {
Template string `yaml:"template"`
Parameters struct {
AppName string `yaml:"app_name"`
AppRepoBranch string `yaml:"app_repo_branch"`
LocationEnv string `yaml:"location_env"`
ComponentName string `yaml:"component_name"`
ClusterName string `yaml:"cluster_name"`
} `yaml:"parameters"`
} `yaml:"stages"`
}
登录后复制
编辑前归档 yaml
trigger: none
variables:
- name: app_name
value: ''
- name: cluster_name
value: ''
- name: component_name
value: ''
- name: location_env
value: 'dev'
stages:
- template: 'tem'
parameters:
app_name: '${{ variables.app_name }}'
app_repo_branch: 'dev'
location_env: '${{ variables.location_env }}'
component_name: '${{ variables.component_name }}'
cluster_name: '${{ variables.cluster_name }}'
登录后复制
编辑后归档yaml
trigger: none
variables:
- name: app_name
value: test
- name: cluster_name
value: test
- name: component_name
value:
- name: location_env
value: dev
stages:
- template: tem
parameters:
app_name: ${{ variables.app_name }}
app_repo_branch: develop
location_env: ${{ variables.location_env }}
component_name: ${{ variables.component_name }}
cluster_name: ${{ variables.cluster_name }}
登录后复制
如您所见,单引号消失了。有什么建议吗?
解决方法
yaml.Unmarshal
函数将 yaml 值解组到不带元数据的自定义结构(style、kind) > 等)。
yaml.Marshal
函数正在处理自定义结构,将元数据值设置为默认值。要访问元数据的字段,需要使用 yaml.Node$ $endc$$
。
在您的情况下 Value
字段具有 yaml.Style
等于 yaml.SingleQuotedStyle
要访问它(解组后不要丢失),请将 Value
字段类型更改为 yaml.Node
。
Variables []struct {
Name string `yaml:"name"`
Value yaml.Node `yaml:"value"`
} `yaml:"variables"`
登录后复制
for i := range config.Variables {
switch config.Variables[i].Name.Value {
case "app_name":
config.Variables[i].Value.Value = nameValue
case "cluster_name":
config.Variables[i].Value.Value = nameCluster
}
}
登录后复制
游乐场
以上就是编辑时在 YAML 文件中保留单引号的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!