如何配置 NSwag.msbuild 以跨平台构建 net.core 项目工作?

How to configure NSwag.msbuild to work across platform building net.core projects?

我希望能够在我的其余客户端项目中删除 nswag.json 和 swagger.json 并自动生成 cs 代码。

此外,如果项目是最新的,请不要再次构建它。

在您的 csproj 文件中,在结束标记前添加以下代码

<PropertyGroup>
    <GeneratedClientsRoot>./*/</GeneratedClientsRoot>
    <GeneratedClientsWildcard>$(GeneratedClientsRoot)*.cs</GeneratedClientsWildcard>
</PropertyGroup>

<ItemGroup>
    <GeneratedClients Include="$(GeneratedClientsWildCard)" />
    <NSwagFiles Include="$(GeneratedClientsRoot)nswag.json" Condition="'@(GeneratedClients)' != ''" />
    <SwaggerFiles Include="$(GeneratedClientsRoot)swagger.json" Condition="'@(GeneratedClients)' != ''" />
</ItemGroup>

<Target Name="ForceGenerateClients" BeforeTargets="CoreCompile" Condition="'@(GeneratedClients)' == ''">
    <CallTarget Targets="GenerateClients" />
</Target>

<Target Name="AutoGenerateClients" BeforeTargets="CoreCompile" Inputs="@(NSwagFiles);@(SwaggerFiles)" Outputs="@(GeneratedClients)">
    <CallTarget Targets="GenerateClients" />
</Target>

<Target Name="GenerateClients">
    <Message Text="Generating swagger clients" Importance="high" />
    <ItemGroup Condition="'@(NSwagFiles)' == ''">
        <NSwagFiles Include="$(GeneratedClientsRoot)nswag.json" />
    </ItemGroup>
    <Exec Command="$(NSwagExe_Core31) run %(NSwagFiles.RelativeDir)%(NSwagFiles.Filename).json" />
    <ItemGroup>
        <NewClients Include="$(GeneratedClientsWildCard)" Exclude="@(GeneratedClients)" />
    </ItemGroup>
    <Message Text="Generated clients @(NewClients)" Importance="high" />
    <ItemGroup>
        <Compile Include="@(NewClients)" />
    </ItemGroup>
</Target>

第一个 属性 GeneratedClientsRoot 是您的文件所在的文件夹模式。如果您为每个 nswag.json 创建一个文件夹,那么默认的“./*/”就是您所需要的。

例如,如果您希望项目根目录中的所有客户端只需将 GeneratedClientsRoot 更改为“./”

如果创建了 none 客户端,以上代码将强制生成客户端,然后将检测是否发生了对 nswag 文件的更改并相应地重新生成客户端。

--编辑 - 添加nswag.json配置示例

这是突出显示重要配置位的部分 nswag.json 配置。

{
    "runtime": "NetCore31",
    "defaultVariables": null,
    "documentGenerator": {
        "fromDocument": {
            "json": "",
            "url": "swagger.json",
            "output": null
        }
    },
    "codeGenerators": {
        "openApiToCSharpClient": {
            "className": "MyRestServiceClient",
            "namespace": "RestServices.MyRestService",
            "output": "MyRestServiceClient.cs"
        }
    }
}

输出需要与 nswag 位于同一文件夹中。理想情况下类名与文件名匹配,并且不要忘记命名空间。

-- 编辑 2 - 先决条件

为了使用它,您需要将 nugget 包 nswag.msbuild 添加到您的项目中。

将 NSwagExe_Core31 更改为 NSwagExe_Core21 或您正在使用的任何框架版本。 同时将 nswag 运行时更改为正确的运行时。