我正在尝试设置多项目属性,就像它在此链接/文章中所说的那样,其中基本模板引用另一个TDS项目。 http://hedgehogdevelopment.github.io/tds/chapter4.html#multi-project-properties
与上述链接类似,我有TDS项目TDS A,它在项目X和TDS项目B(基础模板)中生成代码,在项目Y中生成代码。项目X引用Y和TDS项目A引用多项目中的项目B.项目属性设置。
听起来我正在做文章所说的。但是,从TDS项目A生成的代码无法生成对TDS项目B生成的代码的引用。举例说明发生了什么:所以正确的行为是在Project X中生成的类说D类应该从基类继承从项目Y说出类库,而不是为不存在的类库创建自己的完全限定名称空间版本。它使用自己的程序集命名空间ProjectX.tree.structure.BaseClass,它应该是ProjectY.tree.structure.BaseClass。
有没有人让这个工作。我错过了什么吗?
我通过调整T4模板让它工作,但这不是最好的解决方案
谢谢
答案 0 :(得分:3)
团队中有人帮助了我。这不是最好的解决方案,但如果您有如上定义的设置,则应该有效。 Trick是在Helpers.tt模板中修改下面的方法。添加标有注释的行。应该能够进一步扩展这一点,以便不对基础项目命名空间进行硬编码。如果我开始计算,那么会发布。
public static string GetNamespace(string defaultNamespace, SitecoreItem item, bool includeGlobal = false)
{
List<string> namespaceSegments = new List<string>();
// add the following line
namespaceSegments.Add(!item.ReferencedItem ? defaultNamespace : "[BaseProjectNameSpace]");
namespaceSegments.Add(item.Namespace);
string @namespace = AsNamespace(namespaceSegments); // use an extension method in the supporting assembly
return (includeGlobal ? string.Concat("global::", @namespace) : @namespace).Replace(".sitecore.templates", "").Replace("_", "");
}
答案 1 :(得分:0)
这篇文章相当老,但是我相信我已经找到了解决方法。我开始浏览GlassV5Item.tt。模板生成继承字符串时,它将调用方法GetObjectInheritanceDefinition(DefaultNamespace, template, true, (string s) => AsInterfaceName(s))
。该方法如下所示:
<#+
/// <summary>
/// Gets the inheritance string for the generated template
/// </summary>
/// <param name="defaultNamespace">The default namespace.</param>
/// <param name="template">The template to get the bases for.</param>
/// <param name="nameFunc">The function to run the base templates names through.</param>
/// <returns></returns>
public static string GetObjectInheritanceDefinition(string defaultNamespace, SitecoreTemplate item, bool includeLeadingComma, Func<string, string> nameFunc)
{
if (item.BaseTemplates.Count > 0)
{
return string.Concat(includeLeadingComma ? ", " : "",
item.BaseTemplates
.Select(bt => GetFullyQualifiedName(defaultNamespace, bt, nameFunc)) // select the name of the template with an 'I' prefix
.Aggregate( (total,next) => total + ", " + next) // basically a string.join(string[], '')
);
}
return "";
}
代码中令人讨厌的部分是.Select( bt => GetFullyQualifiedName(defaultNamespace, bt, nameFunc))
。
该模板不尝试解析基本模板的名称空间。我通过更改选择来解决此问题,如下所示:
.Select(bt => GetFullyQualifiedName(bt.TargetProjectName, bt, nameFunc))
我不确定TargetProjectName
是否是最好的属性,但是由于我们的项目是基于Helix的,因此TargetProjectName
的名称和该项目的名称空间是否匹配。
这里最大的关键是,继承的名称空间是从项目中派生的,而不是从硬编码的参数中派生的,正如您所说的那样。
我希望这会有所帮助!