2016-12-27 54 views
2

我正在嘗試爲dotnet核心編寫一個自定義代碼生成器,但迄今爲止僅憑藉其有限的文檔獲得了小小的成功。爲Dotnet核心編寫自定義代碼生成器

圍繞CodeGeneration源代碼稍微介紹一下,發現如何從命令行觸發生成器以及如何在內部工作。

由於dotnet內核中可用的生成器不能滿足我的需要,我嘗試編寫自己的CodeGenerator,但似乎無法通過「dotnet aspnet-codegenerator」命令調用它。下面是我的自定義代碼生成器(目前還沒有實現 - 我的目標是能夠從DOTNET CLI觸發此與異常結束),

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

確定。找出我的代碼中缺少的東西。

幾乎所有的東西都是正確的,除了定製代碼生成器不能與web項目駐留在同一個程序集中,並且定製代碼生成器應該作爲程序包引用從web項目中引用(項目引用不會工作)。

下面是要求自定義代碼生成器是對DOTNET CLI代碼生成可見,

  • 應該是web項目之外
  • 應該有Microsoft.VisualStudio.Web.CodeGeneration作爲一個依賴
  • 自定義代碼生成應該被打包並添加爲web項目的依賴項,這將使用代碼生成器

dotnet pack -o ../custompackages

(確保將此位置(../custompackages)添加到nuget。配置)

注意:在我的問題的代碼具有不接受模型參數(-m開關模型),預計一controllerName參數,所以,調用代碼生成器,你將不得不使用,

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

OR

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

我有我的代碼生成代碼作爲塊包,我想允許從命令行執行一旦安裝,是否有意義? –