如何使用CodeSmith工具将生成的文件添加到多个项目中

时间:2010-06-03 19:15:49

标签: visual-studio-2008 codesmith

我在我当前的项目中使用CodeSmith而且我正试图找出问题所在。对于我的CodeSmith项目(.csp),我可以选择一个选项,让它自动将所有生成的文件添加到当前项目(.csproj)。但我希望能够将输出添加到多个项目(.csproj)。 CodeSmith中是否有允许这样的选项?或者有一种以编程方式执行此操作的好方法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

我无法找到让CodeSmith自动处理此问题的方法,所以我最终在Code Behind文件中编写了一个自定义方法来处理这个问题。

一些注意事项: - proj文件是XML,因此相当容易编辑,但实际的“ItemGroup”节点包含项目中包含的文件列表实际上并没有以任何特殊方式标记。我最终选择了“包含”子节点的“ItemGroup”节点,但可能有更好的方法来确定您应该使用哪个节点。 - 我建议立即执行所有proj文件更改,而不是创建/更新每个文件。否则,如果从Visual Studio启动生成,则可能会出现“此项已更改,是否要重新加载” - 如果您的文件受源代码控制(它们是,对吗?!),您将需要处理检出文件并将其添加到源代码控制以及编辑proj文件。

以下是(或多或少)用于向项目添加文件的代码:

/// <summary>
/// Adds the given file to the indicated project
/// </summary>
/// <param name="project">The path of the proj file</param>
/// <param name="projectSubDir">The subdirectory of the project that the 
/// file is located in, otherwise an empty string if it is at the project root</param>
/// <param name="file">The name of the file to be added to the project</param>
/// <param name="parent">The name of the parent to group the file to, an 
/// empty string if there is no parent file</param>
public static void AddFileToProject(string project, string projectSubDir, 
        string file, string parent)
{
    XDocument proj = XDocument.Load(project);

    XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
    var itemGroup = proj.Descendants(ns + "ItemGroup").FirstOrDefault(x => x.Descendants(ns + "Compile").Count() > 0);

    if (itemGroup == null)
        throw new Exception(string.Format("Unable to find an ItemGroup to add the file {1} to the {0} project", project, file));

    //If the file is already listed, don't bother adding it again
    if(itemGroup.Descendants(ns + "Compile").Where(x=>x.Attribute("Include").Value.ToString() == file).Count() > 0)
        return; 

    XElement item = new XElement(ns + "Compile", 
                    new XAttribute("Include", Path.Combine(projectSubDir,file)));

    //This is used to group files together, in this case the file that is 
    //regenerated is grouped as a dependent of the user-editable file that
    //is not changed by the code generator
    if (string.IsNullOrEmpty(parent) == false)
        item.Add(new XElement(ns + "DependentUpon", parent));

    itemGroup.Add(item);

    proj.Save(project); 

}

答案 1 :(得分:0)

您是否考虑过编译成共享程序集(DLL),然后可以被所有项目引用?

我知道这可能不符合您的要求,但我认为这将是实现所有项目可以使用的单一来源的最佳方式之一,并且只需要一个代码库来维护。