我们有一个Asp.Net Core 2.0 Web服务,我们在Docker容器中部署它。
对于Web服务,我们生成一个xml文档文件,我们在Swagger-ui中使用该文件。这适用于从项目本身生成的xml文档,但是当在Docker容器中部署Web服务时,我无法获得为包含的包生成的xml注释。
nuget包(也是由我们创建)确实包含一个xml文档文件,我们可以在本地计算机上运行服务时使用swagger。通过调用.IncludeXmlComments使文档可以通过swagger获得,文档的路径是通过获取程序集的路径然后用.xml替换.dll扩展名来确定的。
我怀疑包的xml doc文件没有包含在容器中,因此无法找到。在Dockerfile中,我看到了命令
COPY publish .
我要么也喜欢添加/复制包的xml doc文件的命令,或者知道如何使xml doc文件成为发布资产的一部分。任何其他使这项工作以健壮的方式工作的解决方案(不仅仅是在我的机器上)也是受欢迎的。
编辑:我们现在在Docker容器中有额外的xml doc文件,但Swagger仍然没有显示该文件中提供的描述(在本地运行时它会执行此操作)。我们使用了类似的东西:
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
<ItemGroup>
<DocFile Include="$(USERPROFILE)\.nuget\packages\{packagename}\**\lib\$(TargetFramework)\{PackageName}.xml" />
</ItemGroup>
<Copy SourceFiles="@(DocFile)" DestinationFolder="$(PublishDir)" SkipUnchangedFiles="false" />
</Target>
其中{PackageName}应替换为您的包的实际名称。路径中的通配符使其与版本无关(尽管我们必须检查这是否会导致问题,因为我们有多个版本)。
确保已在项目属性 - >构建 - > XML文档文件下检查了发布配置的XML文档复选框。您可能已经检查过它的Debug配置,但没有检查Release Configuration。从项目属性下的下拉列表中选择Release,然后选中XML Documentation file复选框。您的docker RUN dotnet发布“”-c Release -o / app不会生成Documentation XML文件,除非您选中Release配置的复选框。
我会回答我自己的问题,因为一位同事发现了如何解决这个问题。您只需要更改nuget包,只需按照以下步骤操作:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)projectname.xml">
<Link>projectname.xml</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<None Include="bin\$(Configuration)\$(TargetFramework)\projectname.xml" Pack="true" PackagePath="build" />
<None Include="build\projectname.targets" Pack="true" PackagePath="build" />
</ItemGroup>
<ItemGroup>
<Folder Include="build\" />
<Folder Include="Properties\" />
</ItemGroup>
用您选择的名称替换“projectname”,我们使用了项目的名称。这些修改将在项目的根目录中添加包的xml文档文件,该项目使用它与属性构建操作:无和复制输出目录:总是复制。之后我们可以看到包中的xml注释,如果它是部署在Docker容器中,则不需要修改Docker文件。
通常,我们不会在生产环境中公开API文档。该文档对开发环境很有用。
因此,我想出了一个不同的工作。
我使用默认配置运行build&publish命令,即debug。
RUN dotnet build -o /app
RUN dotnet publish -o /app
我已经在我的开发环境中部署了这个以供UI开发人员参考。我希望这有帮助。