根据注释生成xml和从nuget包中复制xml显示到swagger

生成xml到输出目录

从注释生成xml

在要生成xml的项目的csproj中添加如下代码, 生成的xml名称为项目名称.xml. 比如该项目叫做Abp.Application, 则xml名为 Abp.Application.xml

  <PropertyGroup>
    <GenerateDocumentationFile>true</GenerateDocumentationFile>
  </PropertyGroup>

然后生成就会将xml拷贝到输出目录了

从nuget包中拷贝xml到输出目录

linux下构建需要设置环境变量NUGET_XMLDOC_MODE=none, 在官方文档中有解释NUGET_XMLDOC_MODE的作用
然后修改csproj, 添加如下代码, 构建和发布都会将nuget包中以Abp开头的xml和pdb文件拷贝到输出目录了, 如果是要拷贝所有包的xml和pdb都拷贝过去可以把Abp.xml改为.xml, pdb文件同理.

  <Target Name="CopyXmlDocs" BeforeTargets="Build">
    <ItemGroup>
      <XmlDocs Include="%(Reference.RelativeDir)Abp.*.xml;%(Reference.RelativeDir)Abp.*.pdb" />
    </ItemGroup>
    <Message Text="Copying XML docs to $(OutputPath)" Importance="High" />
    <Copy SourceFiles="@(XmlDocs)" DestinationFolder="$(PublishDir)" Condition="Exists(%(FullPath))" />
  </Target>

swagger添加xml显示注释

加载拷贝到输出目录的xml,在services.AddSwaggerGen的方法中添加如下代码.
GetFiles("*.xml", SearchOption.TopDirectoryOnly)
如果是拷贝了所有的xml,而只想加载以Abp.开头的xml文件则可以把*.xml改为Abp.*.xml

                    //遍历所有xml并加载
                    var binXmlFiles =
                        new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory.IsNullOrEmpty()
                            ? Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)
                            : AppDomain.CurrentDomain.BaseDirectory).GetFiles("*.xml", SearchOption.TopDirectoryOnly);
                    foreach (var filePath in binXmlFiles.Select(item => item.FullName))
                    {
                        options.IncludeXmlComments(filePath, true);
                    }

完整示例

services.AddSwaggerGen(options=>
{
                    options.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
                    options.DocInclusionPredicate((docName, description) => true);
                    options.CustomSchemaIds(type => type.ToString());
                    //遍历所有xml并加载
                    var binXmlFiles =
                        new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory.IsNullOrEmpty()
                            ? Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)
                            : AppDomain.CurrentDomain.BaseDirectory).GetFiles("*.xml", SearchOption.TopDirectoryOnly);
                    foreach (var filePath in binXmlFiles.Select(item => item.FullName))
                    {
                        options.IncludeXmlComments(filePath, true);
                    }
}
posted @ 2021-10-28 16:57  turingguo  阅读(362)  评论(0编辑  收藏  举报