Есть ли способ объединить поля без добавления doneMatch в поле? - PullRequest
0 голосов
/ 04 августа 2020

Нам нужно объединить два поля в одно. В конфигурации есть специальная строка «doneMatch», которая, кажется, добавляется к объединенному полю. Зачем это нужно, и есть ли способ не добавлять его в целевое поле?

Например, у меня есть:
sr c .fieldA = "City"
sr c .fieldB = "State"

Я хочу объединить эти 2 поля в target.fieldA как "City: State". Однако в итоге я получаю «City: State ## DONE ##». Я могу изменить файл конфигурации так, чтобы он использовал другой doneMatch, но он не может быть пустым или пустым ... поэтому, если я изменил его на "; ", то результирующее поле будет" Город: Штат; ". По какой-то причине мне нужно закончить char / string. Для чего это используется? Если я синхронизирую поля с новыми обновлениями, будет ли он обнаруживать предыдущий ## DONE ## в target.fieldA и думать, что он уже выполнил слияние, поэтому не будет вносить никаких новых изменений?

Может кто-нибудь прислал мне дополнительную информацию об этой функции?

Ответы [ 2 ]

1 голос
/ 13 августа 2020

Я обновил код для версии 9.0.1, которая меняет способ работы FieldMerge. Он больше не использует doneMatch и вместо этого требует, чтобы все 3 поля были разными, а затем пропускает, если это уже было сделано.

 if (source.Fields.Contains(config.sourceField1) && source.Fields.Contains(config.sourceField2))
            {
                var val1 = source.Fields[config.sourceField1].Value != null ? source.Fields[config.sourceField1].Value.ToString() : string.Empty;
                var val2 = source.Fields[config.sourceField2].Value != null ? source.Fields[config.sourceField2].Value.ToString() : string.Empty;
                var valT = target.Fields[config.targetField].Value != null ? target.Fields[config.targetField].Value.ToString() : string.Empty;
                var newValT = string.Format(config.formatExpression, val1, val2);

                if (valT.Equals(newValT))
                {
                    Trace.WriteLine(string.Format("  [SKIP] field already merged {0}:{1}+{2} to {3}:{4}", source.Id, config.sourceField1, config.sourceField2, target.Id, config.targetField));
                } else
                {
                    target.Fields[config.targetField].Value = string.Format(config.formatExpression, val1, val2) + config.doneMatch;
                    Trace.WriteLine(string.Format("  [UPDATE] field merged {0}:{1}+{2} to {3}:{4}", source.Id, config.sourceField1, config.sourceField2, target.Id, config.targetField));
                }

            }

https://github.com/nkdAgility/azure-devops-migration-tools/pull/529

0 голосов
/ 04 августа 2020

Протестируйте слияние полей с помощью инструментов Azure Devops Migration, я также мог воспроизвести эту ситуацию. Поле doneMatch обязательно в файле configuration.json (по умолчанию ## Done ##).

Кажется, нет способа избежать добавления donematch в целевое поле. Поскольку я не являюсь разработчиком этого инструмента, я не уверен в функциях этого поля.

Я хотел бы поделиться обходным путем для решения этой проблемы.

Временное решение:

Вы можете попробовать установить " " в поле doneMatch. ("doneMatch": " ")

Например:

 "FieldMaps": [
    {
      "ObjectType": "VstsSyncMigrator.Engine.Configuration.FieldMap.FieldMergeMapConfig",
      "WorkItemTypeName": "*",
      "sourceField1": "System.Description",
      "sourceField2": "Microsoft.VSTS.Common.AcceptanceCriteria",
      "targetField": "System.Description",
      "formatExpression": "{0} {1}",
      "doneMatch": " "
    }

Поскольку файл конфигурации представляет собой файл Json, вы можете использовать " " для обозначения пробелов.

Результат:

введите описание изображения здесь

будет ли он обнаруживать предыдущий ## DONE ## в target.fieldA и думать, что уже выполнил слияние, поэтому не будет вносить никаких новых изменений

Согласно моему тесту, ##Done## в целевом поле не повлияет на другие операции. Вы по-прежнему можете работать с этим полем.

Обновление:

Вышеупомянутый метод может работать только с типом поля: Text (multiple lines). Если поле другого типа, этот метод не работает.

Вы можете создать новое поле (Text (multiple lines)). Затем вы можете установить целевое поле как новое поле.

например,

 "FieldMaps": [

 
    {
      "ObjectType": "VstsSyncMigrator.Engine.Configuration.FieldMap.FieldMergeMapConfig",
      "WorkItemTypeName": "*",
      "sourceField1": "Custom.test1",
      "sourceField2": "Custom.test2",
      "targetField": "Custom.test3",
      "formatExpression": "{0} {1}",
      "doneMatch": " "
    }
...