Есть ли способ объединить поля без добавления 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": " "
}