Так как в вашем отображении есть дублирующий ключ, который не разрешен в YAML 1.2 (и должен хотя бы выдавать предупреждение в YAML 1.1), это не сработает, но даже если вы исправите это, вы не сможете делайте это только с помощью якорей и псевдонимов.
Единственной заменой, подобной замене, которая доступна в YAML, является «Независимый от языка слияния тип ключа» . На него косвенно ссылаются в спецификации YAML, и он не включен в него, но доступен в большинстве анализаторов.
Единственное, что позволяет это сделать, это «обновить» отображение парами ключ-значение одного или нескольких других отображений, , если ключ еще не существует в отображении. Для этого вы используете специальный ключ <<
, который принимает псевдоним или список псевдонимов.
Не существует средства, указанного в спецификации YAML , для разыменования частичных ключей.
Есть некоторые системы, которые используют шаблоны, которые генерируют YAML, но есть две основные проблемы, чтобы применить их здесь:
сами языки шаблонов часто конфликтуют с индикаторами в синтаксисе YAML, делая шаблон недопустимым YAML
, даже если шаблон может быть загружен как допустимый YAML, и извлечены значения, необходимые для обновления других частей шаблона, потребуется проанализировать входные данные дважды (один раз, чтобы получить значения для обновления шаблона, затем для анализа обновленного шаблона). Учитывая потенциальную сложность YAML и относительную медленную скорость его синтаксических анализаторов, это может быть непомерно
Что вы можете сделать, это создать какой-нибудь тег (например, !lookup
) и иметь интерпретатор его конструктора этот узел. Поскольку узел снова должен быть действительным YAML, вам нужно решить, использовать ли последовательность или отображение. Вы должны будете включить некоторый специальный синтаксис для значений в обоих случаях, а также для ключа (например, <<
, используемого в слияниях) в случае отображений.
В примерах я пропустил ложные одинарные кавычки, в зависимости от ваших реальных ценностей, они могут вам, конечно, понадобиться.
Пример с использованием последовательности:
.map_values: &my_map
a: D
b: E
c: F
section: !Lookup
- *my_map
- stage:
Пример с использованием сопоставления:
.map_values: &my_map
a: D
b: E
c: F
section: !Lookup
>>: *my_map
stage:
И то, и другое может быть сделано для построения данных на лету (т. Е. Без предварительной загрузки вашей структуры данных) необходимо). Например. используя Python и последовательность «style» в input.yaml
:
import sys
import ruamel.yaml
from pathlib import Path
input = Path('input.yaml')
yaml = ruamel.yaml.YAML(typ='safe')
yaml.default_flow_style = False
@yaml.register_class
class Lookup:
@classmethod
def from_yaml(cls, constructor, node):
"""
this expects a two entry sequence, in which the first is a mapping X, typically using
an alias
the second entry should be an mapping, for which the values which have the form
are looked up in X
non-existing keys will throw an error during loading.
"""
X, res = constructor.construct_sequence(node, deep=True)
yield res
for key, value in res.items():
try:
if value.startswith('<') and value.endswith('>'):
res[key] = X[value[1:-1]]
except AttributeError:
pass
return res
data = yaml.load(input)
yaml.dump(data, sys.stdout)
, что дает:
.map_values:
a: D
b: E
c: F
section:
stage: E
Есть несколько вещей, на которые следует обратить внимание:
<...>
является произвольным, вам не нужны маркер начала и конца. Я рекомендую использовать некоторые символы, которые не имеют специального значения в YAML, поэтому вам не нужно указывать свои значения в кавычках. Вы можете, например, используйте некоторые хорошо узнаваемые точки Unicode, но они, как правило, являются трудной для ввода в редакторе. from_yaml
, якорь еще не полностью построен. Так что X
- это пустой диктет, который заполняется позже. Построенный с помощью yield
реализует двухэтапный процесс: сначала мы возвращаем res
«как есть» обратно конструктору, а затем обновляем его. Этап конструктора загрузчика знает, как обрабатывать это автоматически, когда он получает генератор вместо «нормального» значения. try
.. except
предназначены для обработки значений отображения, которые не являются строками (то есть числа, даты, логические значения). Поскольку теги являются стандартным YAML, вышеприведенное должно быть так или иначе выполнено в любом парсере YAML, независимо языка.
Если Ваш проект является открытым исходным кодом, можно использовать Разработчика Установки BitRock бесплатно. И эта страница на wxWidgets сайте перечисляет много различных установщиков платформы, описывая различные проблемы с каждым.
Я не знаю ни о каких свободных межплатформенных, извините. Я действительно знаю, что несколько коммерческих компаний, которые я знаю, клянутся BitRock. Существует довольно много стопок Linux, созданных с ним.
Необходимо смотреть на InstallJammer. Свободный, с открытым исходным кодом, и очень простой в использовании будучи достаточно мощными для создания примерно чего-либо Вам нужно. Поддержки большинство платформ out-of-the-box.
Вот список некоторых: Генераторы Установщика С открытым исходным кодом в Java.