有没有办法在不将 doneMatch 添加到字段中的情况下合并字段?
Is there any way to merge fields without adding the doneMatch into the field?
我们需要将两个字段合并为一个。在配置中,有一个“doneMatch”特殊字符串,这似乎附加到合并字段中。为什么需要这个,有没有办法不将它也附加到目标字段?
例如,我有:
src.fieldA = "城市"
src.fieldB = "州"
我想将这 2 个字段合并到 target.fieldA 中作为“城市:州”。但是,我最终得到的是“City: State##DONE##”我可以更改配置文件,以便它使用不同的 doneMatch 但它不能为 null 或空.. 所以如果我将它更改为“; ”,则结果字段将是“城市:州;”。出于某种原因,我必须完成 char/string。这是做什么用的?如果我将字段与较新的更新同步,它是否会检测到 target.fieldA 中之前的 ##DONE## 并认为它已经完成合并,所以不会进行任何新的更改?
有人可以向我发送有关此功能的更多信息吗?
使用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文件,可以用" "
表示空格。
结果:
is it going to detect the previous ##DONE## in the target.fieldA and
think it's already done the merge, so would not make any new changes
根据我的测试,目标字段中的##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": " "
}
我更新了 v9.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
我们需要将两个字段合并为一个。在配置中,有一个“doneMatch”特殊字符串,这似乎附加到合并字段中。为什么需要这个,有没有办法不将它也附加到目标字段?
例如,我有:
src.fieldA = "城市"
src.fieldB = "州"
我想将这 2 个字段合并到 target.fieldA 中作为“城市:州”。但是,我最终得到的是“City: State##DONE##”我可以更改配置文件,以便它使用不同的 doneMatch 但它不能为 null 或空.. 所以如果我将它更改为“; ”,则结果字段将是“城市:州;”。出于某种原因,我必须完成 char/string。这是做什么用的?如果我将字段与较新的更新同步,它是否会检测到 target.fieldA 中之前的 ##DONE## 并认为它已经完成合并,所以不会进行任何新的更改?
有人可以向我发送有关此功能的更多信息吗?
使用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文件,可以用" "
表示空格。
结果:
is it going to detect the previous ##DONE## in the target.fieldA and think it's already done the merge, so would not make any new changes
根据我的测试,目标字段中的##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": " "
}
我更新了 v9.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