Comment ajouter des fichiers générés à plusieurs projets en utilisant des outils CodeSmith

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

  •  24-10-2019
  •  | 
  •  

Question

J'utilise CodeSmith sur mon projet en cours et je suis en train de comprendre un problème. Pour mon projet CodeSmith (de .csp) Je peux sélectionner une option pour avoir ajouter automatiquement tous les fichiers générés au projet en cours (.csproj). Mais je veux être en mesure d'ajouter la sortie à plusieurs projets (.csproj). Y at-il une option à l'intérieur de CodeSmith pour permettre cela? Ou est-il un bon moyen de faire un programme que?

Merci.

Était-ce utile?

La solution

je ne pouvais pas trouver un moyen de faire CodeSmith gérer ce problème automatiquement, donc je fini par écrire une méthode personnalisée dans le fichier code-behind pour gérer cela.

Quelques notes: - Les fichiers XML sont proj et que donc assez facile à modifier, mais le nœud réel « ItemGroup » qui contient la liste des fichiers qui sont inclus dans le projet ne fait étiquetés d'une manière particulière. J'ai fini par choisir le noeud « ItemGroup » qui a « Contient » nœuds enfants, mais il pourrait y avoir une meilleure façon de déterminer que vous devriez utiliser. - Je recommande de faire tous les changements de fichiers proj à la fois, au lieu comme chaque fichier est créé / mis à jour. Sinon, si vous lancez la génération à partir de Visual Studio, vous pourriez obtenir un flot de « Cet article a changé, voulez-vous reload » -. Si vos fichiers sont sous contrôle de code source (ils sont, non ?!), vous allez devoir gérer la vérification des fichiers et de les ajouter au contrôle de source ainsi que la modification des fichiers proj

Voici (plus ou moins) le code que je l'habitude d'ajouter un fichier au projet:

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

}

Autres conseils

Avez-vous pensé à générer à partir d'dans un ensemble partagé (DLL) qui peut ensuite être référencé par tous vos projets?

Je sais que cela peut ne pas répondre à vos besoins, mais je suppose que ce serait l'un des meilleurs moyens de parvenir à une source unique que tous vos projets peuvent utiliser et aussi une seule base de code pour maintenir au besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top