Как я могу потребовать по крайней мере одного из двух дополнительных компонентов в WiX?

( Обновление : август 2011 )

Как упоминания geofflane в [1 110] его ответ , Java 7 теперь поддерживает названные группы .
, tchrist указывает в комментарии, что поддержка ограничена.
Он детали ограничения в его большом ответе" Java Помощник Regex "

названная поддержка группы Java 7 regex была представлена назад в [1 114] сентябрь 2010 в блоге .

Oracle В официальном выпуске Java 7, конструкции для поддержки именованной группы фиксации:

  • (?capturing text) для определения именованной группы "имя"
  • \k к обратной ссылке именованная группа "имя"
  • ${name} для ссылки полученной группе в замещающей строке Matcher
  • Matcher.group(String name) для возврата полученной входной подпоследовательности данной "названной группой".

Другие альтернативы для предварительного Java 7 были:

( Исходный ответ : Jan 2009 , со следующими двумя связями, теперь разорванными)

, Вы не можете обратиться к именованной группе, если Вы не кодируете свою собственную версию Regex...

, Который является точно, что Gorbush2 сделал в этом потоке .

Regex2

(ограниченная реализация, как указано снова [1 127] tchrist, поскольку это только ищет идентификаторы ASCII. tchrist детализирует ограничение как:

только способность иметь ту, названную группой на то же имя (которым Вы don’t всегда управляете!) и не бывший способный использовать их для в - regex рекурсия.

Примечание: можно найти истинные regex примеры рекурсии в Perl и PCRE regexes, как упомянуто в [1 128] Питание Regexp , Соответствующие строки спецификаций и PCRE со Сбалансированными Круглыми скобками слайд)

Пример:

Строка:

"TEST 123"

RegExp:

"(?\\w+) (?\\d+)"

Доступ

matcher.group(1) ==> TEST
matcher.group("login") ==> TEST
matcher.name(1) ==> login

Замена

matcher.replaceAll("aaaaa_$1_sssss_$2____") ==> aaaaa_TEST_sssss_123____
matcher.replaceAll("aaaaa_${login}_sssss_${id}____") ==> aaaaa_TEST_sssss_123____ 

(извлекают из реализации)

public final class Pattern
    implements java.io.Serializable
{
[...]
    /**
     * Parses a group and returns the head node of a set of nodes that process
     * the group. Sometimes a double return system is used where the tail is
     * returned in root.
     */
    private Node group0() {
        boolean capturingGroup = false;
        Node head = null;
        Node tail = null;
        int save = flags;
        root = null;
        int ch = next();
        if (ch == '?') {
            ch = skip();
            switch (ch) {

            case '<':   // (?'){
                    // valid group name
                    int len = cursor-start;
                    int[] newtemp = new int[2*(len) + 2];
                    //System.arraycopy(temp, start, newtemp, 0, len);
                    StringBuilder name = new StringBuilder();
                    for(int i = start; i< cursor; i++){
                        name.append((char)temp[i-1]);
                    }
                    // create Named group
                    head = createGroup(false);
                    ((GroupTail)root).name = name.toString();

                    capturingGroup = true;
                    tail = root;
                    head.next = expr(tail);
                    break;
                }

5
задан Michael Bray 2 September 2009 в 01:29
поделиться

3 ответа

Я думаю, что на самом деле вы хотите здесь поставить условие в элементе для кнопки «Далее», чтобы она не включалась, пока ваши условия не будут выполнены. Что-то вроде:

<Publish Dialog="..." Control="Next" Event="NewDialog" Value="...">OptionalPkg1Selected OR OptionaloPkg2Selected</Publish>

Чего я не знаю, так это того, как установить эти условия в зависимости от того, какие компоненты проверяются, хотя должен быть какой-то способ сделать это, чтобы нужные компоненты были установлены позже ...

2
ответ дан 14 December 2019 в 08:56
поделиться

У меня сейчас нет времени проводить технический тест, но я просто хочу указать вам в направлении собственности INSTALLLEVEL. Это довольно нелогичная концепция, связанная с выбором функций. По сути, существует общий INSTALLLEVEL установки, который представляет собой число от 1 до 32 767, и каждая функция имеет свойство Install Level, которое представляет собой число от -32 767 до 32 767. Если значение уровня установки компонента меньше или равно свойству INSTALLLEVEL продукта, функция включается: http://kb.acresso.com/selfservice/viewContent.do?externalID=Q103232

Обычно вы используйте это, чтобы установить состояния функций по умолчанию и отключить скрытые функции в операционных системах, в которых функция не поддерживается. Однако, вы можете использовать эти свойства вместе с настраиваемым действием, запускаемым для следующего события кнопки диалогового окна, чтобы принудительно выбрать хотя бы одну из ваших функций.

И да, диалоговые окна MSI в целом не имеют смысла, и они позволяют сложно работать. В некоторых случаях я заменял одно диалоговое окно в последовательности обычным диалоговым окном Windows exe, чтобы обойти ограничения в общей концепции графического интерфейса пользователя MSI.

Я подумаю, есть ли более простой способ сделать это. Похоже, что это очень срочно, поэтому, возможно, вы захотите узнать у сообществ по развертыванию и просмотреть некоторые из лучших сайтов развертывания:

0
ответ дан 14 December 2019 в 08:56
поделиться

Как насчет использования состояния функции в качестве условия?

Что-то вроде (& Option1 = 2) AND (& Option2 = 2)

Вот ссылка для лучшего понимания:

Дополнительные настраиваемые действия MSI

1
ответ дан 14 December 2019 в 08:56
поделиться
Другие вопросы по тегам:

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