Есть ли способ объединить поля без добавления doneMatch в поле?

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

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

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

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

2 ответа

Решение

Я обновил код для версии 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

Протестируйте слияние полей с помощью инструментов миграции Azure Devops, я также смог воспроизвести эту ситуацию. В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": " "
    }
Другие вопросы по тегам