Бесплатный установщик mulitplatform

Так как в вашем отображении есть дублирующий ключ, который не разрешен в 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

Есть несколько вещей, на которые следует обратить внимание:

    [1119 ] использование <...> является произвольным, вам не нужны маркер начала и конца. Я рекомендую использовать некоторые символы, которые не имеют специального значения в YAML, поэтому вам не нужно указывать свои значения в кавычках. Вы можете, например, используйте некоторые хорошо узнаваемые точки Unicode, но они, как правило, являются трудной для ввода в редакторе.
  • Когда вызывается from_yaml, якорь еще не полностью построен. Так что X - это пустой диктет, который заполняется позже. Построенный с помощью yield реализует двухэтапный процесс: сначала мы возвращаем res «как есть» обратно конструктору, а затем обновляем его. Этап конструктора загрузчика знает, как обрабатывать это автоматически, когда он получает генератор вместо «нормального» значения.
  • try .. except предназначены для обработки значений отображения, которые не являются строками (то есть числа, даты, логические значения).
  • вы также можете делать замены в ключах, просто убедитесь, что вы удаляете старый ключ

Поскольку теги являются стандартным YAML, вышеприведенное должно быть так или иначе выполнено в любом парсере YAML, независимо языка.

10
задан Community 23 May 2017 в 12:07
поделиться

6 ответов

8
ответ дан 3 December 2019 в 20:07
поделиться

Если Ваш проект является открытым исходным кодом, можно использовать Разработчика Установки BitRock бесплатно. И эта страница на wxWidgets сайте перечисляет много различных установщиков платформы, описывая различные проблемы с каждым.

3
ответ дан 3 December 2019 в 20:07
поделиться

Я не знаю ни о каких свободных межплатформенных, извините. Я действительно знаю, что несколько коммерческих компаний, которые я знаю, клянутся BitRock. Существует довольно много стопок Linux, созданных с ним.

4
ответ дан 3 December 2019 в 20:07
поделиться

Я также предлагаю

http://packjacket.sourceforge.net/

1
ответ дан 3 December 2019 в 20:07
поделиться

Необходимо смотреть на InstallJammer. Свободный, с открытым исходным кодом, и очень простой в использовании будучи достаточно мощными для создания примерно чего-либо Вам нужно. Поддержки большинство платформ out-of-the-box.

3
ответ дан 3 December 2019 в 20:07
поделиться
0
ответ дан 3 December 2019 в 20:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: