So fügen Sie mithilfe von Codesmith -Tools generierte Dateien zu mehreren Projekten hinzu

StackOverflow https://stackoverflow.com/questions/2969025

  •  24-10-2019
  •  | 
  •  

Frage

Ich verwende Codesmith für mein aktuelles Projekt und versuche, ein Problem herauszufinden. Für mein Codesmith -Projekt (.CSP) kann ich eine Option auswählen, damit sie automatisch alle generierten Dateien zum aktuellen Projekt (.csproj) hinzufügen lassen. Aber ich möchte in der Lage sein, die Ausgabe zu mehreren Projekten hinzuzufügen (.csproj). Gibt es eine Option in Codesmith, um dies zuzulassen? Oder gibt es eine gute Möglichkeit, das programmatisch zu tun?

Vielen Dank.

War es hilfreich?

Lösung

Ich konnte nicht herausfinden, wie Codesmith dieses Problem automatisch behandelt werden kann. Daher habe ich eine benutzerdefinierte Methode in den Code hinter der Datei geschrieben, um dies zu verarbeiten.

Einige Hinweise: - Die Proj -Dateien sind XML und so ziemlich einfach zu bearbeiten, aber der tatsächliche "ElementGroup" -Knoten, der die Liste der Dateien enthält, die im Projekt enthalten sind, ist nicht tatsächlich auf besondere Weise gekennzeichnet. Am Ende habe ich den Knoten "ItemGroup" ausgewählt, der untergeordnete Knoten "enthält", aber es gibt möglicherweise einen besseren Weg, um festzustellen, welche Sie verwenden sollten. - Ich empfehle, alle Proj -Dateiänderungen gleichzeitig vorzunehmen, anstatt wie jede Datei erstellt/aktualisiert wird. Andernfalls erhalten Sie, wenn Sie die Generation aus Visual Studio starten, möglicherweise eine Flut von "Dieser Artikel hat sich geändert, möchten Sie neu laden" - wenn Ihre Dateien unter der Quellensteuerung stehen (oder?!), Gehen Sie zu MÜSSEN PRÜFUNGEN AUSGEFAHREN UND ADEN IT ABTEILUNG FÜR DIE ZURÜCK -Steuerung sowie Bearbeitung der ProJ -Dateien.

Hier ist (mehr oder weniger) der Code, mit dem ich dem Projekt eine Datei hinzugefügt habe:

/// <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); 

}

Andere Tipps

Haben Sie darüber nachgedacht, nur eine gemeinsame Versammlung (DLL) zusammenzustellen, auf die dann von all Ihren Projekten verwiesen werden kann?

Ich weiß, dass dies möglicherweise nicht Ihren Anforderungen entspricht, aber ich würde davon ausgehen, dass dies eine der besten Möglichkeiten ist, eine einzige Quelle zu erreichen, die alle Ihre Projekte verwenden können, und auch nur eine Codebasis, um sie bei Bedarf aufrechtzuerhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top