Программно генерировать решение Visual Studio - PullRequest
5 голосов
/ 29 апреля 2010

Я хочу написать в .net мастер, который программно генерирует Visual Studio Solution с некоторыми проектами. У меня будет XML-файл с подробной информацией о файлах, которые необходимо включить в проект, с указанием соответствующих путей для их извлечения и списка имен проектов. Есть ли способ, которым я могу достичь этого

Ответы [ 4 ]

3 голосов
/ 29 апреля 2010

Ознакомьтесь с Инструментарием преобразования текстовых шаблонов (T4) . Это довольно мило и поддерживает некоторые процессы генерации файлов в ASP.NET MVC. У Скотта Хансельмана есть отличная вступительная статья на эту тему.

2 голосов
/ 18 мая 2010

Ну, Visual Studio SDK - это ваш путь. Существуют методы, с помощью которых вы можете создавать файлы, а также проекты, основанные на шаблонах проектов. Так, например, вы можете создать новый проект "asp.net mvc" или библиотеку классов. Вы даже можете создать свой собственный шаблон.

Я совершенно уверен, что вы можете сделать это только внутри VS.

В противном случае, нет ничего плохого в том, чтобы сгенерировать проект, а файлы sln будут генерировать файлы xml, и это одна из тех хороших вещей, что в конце они просто xml. Вам просто нужно сгенерировать несколько Projectd Guids, но я думаю, что это будет довольно просто и совершенно "законно".

Хороший прогресс!

1 голос
/ 07 ноября 2011

Вы можете сделать это с помощью небольшого кода или скрипта. Visual Studio заполнит большинство GUID для вас ...

Я собрал что-то подобное вместе, чтобы сравнить проекты. Это не на 100% идеально, вы можете получить дубликаты из того, как код обрабатывает имена проектов. Надеюсь, он укажет вам путь.

Что мы делаем здесь, это устанавливаем преамбулу к файлу Solution, затем вставляем каждое решение (вам нужен guid Типа проекта, здесь видно начало FAE, но не собственный GUID Проекта, который VS вставит при сохранении файла Solution ). Там немного больше шаблона, чем мы вставляем конфигурацию сборки для каждого проекта. У меня было около 12 конфигураций для каждого проекта (разные настройки Release и Debug), но я сократил их до двух.

static void Main(string[] args)
     {
        if(args.Count() != 2)
        {
            Usage();
            return;
        }

        var rootDir = args[0];
        var output = args[1];

        var files = Directory.EnumerateFiles(rootDir, 
                                             "*.*proj", 
                                             SearchOption.AllDirectories);

        var configs = new StringBuilder();

        var configDefs = new string[]{
        ".Debug|Any CPU.ActiveCfg = Debug|Any CPU",
        ".Release|Any CPU.ActiveCfg = Release|Any CPU",
        "Other_configurations_see_solution_for_how"
        };

        using(var sw = new StreamWriter(output))
        {
            sw.WriteLine(Resources.Head);
            foreach(var file in files)
            {
                var relpath = file.Substring(rootDir.Length + 1);
                var split= relpath.Split('\\');
                var name = split[0];
                var path = relpath;
                sw.WriteLine("Project(\"{{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}}\") = \"{0}\", \"{1}\", \"{0}\"", name, path);
                sw.WriteLine("EndProject");

                foreach(var configDef in configDefs)
                {
                    configs.AppendLine(string.Format("{0}{1}", file, configDef));
                }
            }

            sw.WriteLine(@"Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
    Debug|Any CPU = Debug|Any CPU       
    Release|Any CPU = Release|Any CPU
    ...Other_configurations_see_solution_for_how...
EndGlobalSection 
    GlobalSection(ProjectConfigurationPlatforms) = postSolution");

            sw.WriteLine(configs.ToString());
            sw.WriteLine(Resources.Tail);
        }
    }

Голова выглядит примерно так:

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010

Но я думаю, что в первой строке есть управляющие символы - будьте осторожны!

Хвост выглядит как

    GlobalSection(SolutionProperties) = preSolution
    HideSolutionNode = FALSE
    EndGlobalSection
EndGlobal
0 голосов
/ 31 мая 2012

Мы создали инструмент под названием Tree Surgeon , который делает именно это. Вещи находятся на рассмотрении и обсуждении, чтобы оживить (или угробить), поскольку времена изменились, так как он был изначально создан, но он делает то, что вы просите здесь (и с открытым исходным кодом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...