2016-12-27 12 views
2

Я пытаюсь написать собственный генератор кода для ядра dotnet, но пока не имел большого успеха с ограниченной документацией.Написание пользовательского генератора кода для Dotnet Core

Немного поработал с исходным кодом CodeGeneration, выяснил, как запускать генераторы из командной строки и как она работает внутри.

Поскольку генераторы, доступные в ядре дотовой сети, не удовлетворяют моим потребностям, я попытался написать свой собственный CodeGenerator, но, похоже, не смог вызвать его через команду «dotnet aspnet-codegenerator». Ниже мой пользовательский генератор кода (в настоящее время не имеет реализации - моя цель состоит в том, чтобы иметь возможность запускать это из Dotnet кли и в конечном итоге, за исключением),

namespace TestWebApp.CodeGenerator 
{ 
    [Alias("test")] 
    public class TestCodeGenerator : ICodeGenerator 
    { 
     public async Task GenerateCode(TestCodeGeneratorModel model) 
     { 
      await Task.CompletedTask; 

      throw new NotImplementedException(); 
     } 
    } 

    public class TestCodeGeneratorModel 
    { 
     [Option(Name = "controllerName", ShortName = "name", Description = "Name of the controller")] 
     public string ControllerName { get; set; } 

     [Option(Name = "readWriteActions", ShortName = "actions", Description = "Specify this switch to generate Controller with read/write actions when a Model class is not used")] 
     public bool GenerateReadWriteActions { get; set; } 
    } 
} 

Ниже, как я пытаюсь вызвать код генератор,

dotnet aspnet-codegenerator -p . TestCodeGenerator TestController -m TestWebApp.Models.TestModel 

или

dotnet aspnet-codegenerator -p . test TestController -m TestWebApp.Models.TestModel 

Это, хотя, кажется, не работает и жалуется не в состоянии найти генератор пользовательского кода. См сообщение об ошибке ниже,

Finding the generator 'TestCodeGenerator'... 
No code generators found with the name 'TestCodeGenerator' 
    at Microsoft.VisualStudio.Web.CodeGeneration.CodeGeneratorsLocator.GetCodeGenerator(String codeGeneratorName) 
    at Microsoft.VisualStudio.Web.CodeGeneration.CodeGenCommand.Execute(String[] args) 
RunTime 00:00:06.23 

Что это, что мне не хватает или какие изменения я должен сделать для CogeGenerator пикап моего пользовательского класса?

Репро: Github

ответ

3

Ok. Выяснил, чего не хватает в моем коде.

Практически все было правильно, за исключением того факта, что генераторы пользовательского кода не могут находиться в одной и той же сборке, как веб-проект, а генератор настраиваемого кода следует ссылаться из веб-проекта в качестве ссылки на пакет (ссылка на проект не будет Работа).

Ниже приведены требования для генератора пользовательского кода, чтобы быть видимым для генератора кли кода Dotnet,

  • Должно быть вне веб-проекта
  • должны иметь Microsoft.VisualStudio.Web.CodeGeneration как зависимость
  • генератора
  • пользовательского кода должны быть упакованы и добавлены как зависимость от веб-проекта, который будет использовать генератор кода

DotNet пакет -o ../custompackages

(убедитесь, чтобы добавить это место (../custompackages) в NuGet.конфигурации)

Примечание: Код в моем вопросе есть модель, которая не принимает параметр модели (-m переключатель) и ожидает параметр controllerName, так, чтобы вызвать генератор кода вы должны использовать,

dotnet aspnet-codegenerator -p . test --controllerName TestController 

ИЛИ

dotnet aspnet-codegenerator -p . TestCodeGenerator --controllerName TestController 

См, связанной дискуссии here

+0

этот вопрос о том, как написать код поколения erator, используя существующие объекты в aspnet, но я хочу написать исполняемый файл, который выполняется в dotnet cli: например. dotnet mygenerator arg0 arg1, могу ли я использовать это решение? –

+0

@ H.Herzl Это решение делает именно то, что вы хотите. Вы можете управлять параметрами, обновляя TestCodeGeneratorModel (доступный в вопросе), представляя свои пользовательские свойства и украшая их атрибутом [Option]. Кроме того, почему вы хотите ввести новую команду cli, вы пропустите многие функции, предлагаемые aspnet-codegenerator. –

+0

У меня есть код генерации кода как пакет самородок, и я хочу разрешить выполнение из командной строки после его установки, имеет смысл? –