将内容和编译文件从 nuget 复制到 .net 核心项目

Copy Content and Compile files into .net core project from nuget

我正在尝试创建一个包含 class 和 xsd 文件的多目标框架 nuget。 class 文件是从 xml 模式定义文件生成的,并在开发期间使用。然后使用 xsd,而 运行 验证序列化的 class 输出。

由于 nuget 需要成为多目标框架,因此选择了 .net 标准库项目,xsd 与生成的 class 文件一样导入到项目中。我正在使用 visual studio 2019 环境并希望使用 pack 选项。

我面临的问题是,每当我在 nuget 中指定 cs 和 xsd 文件是不同的 buildAction 类型时,xsd 不包含在使用小块。如果我指定 cs 和 xsd 文件都来自相同的 buildaction 类型,则所有文件都包含在内。

但是,如果您将 cs 文件定义为 buildAction“None”或“Content”,则它们不能在使用 Nuget 的项目中使用。只有当您指定 cs 文件来自 buildAction 类型“编译”时,它们才可以使用。 xsd 文件不能来自“编译”类型,因为这会导致安装 Nuget 时出错。

我已经检查了这些文件是否存在于 nuget 中,它们确实存在。它们也在创建并放入 nuget 中的 .nuspec 文件中指定。在将 nuget 安装到项目中之后,它们也出现在 obj\projects.assets.json 文件中。我没有看到任何错误或警告出现。

我在某处读到,因为 nuget 是通过引用为 .net 核心项目打包的,所以内容不会总是显示设计时,但它必须在运行时。有趣的是 xsd 总是丢失,而且从来没有 cs 文件。但在运行时我也没有看到 xml 文件出现。

我更改了我的 csproj 文件,使其支持多目标框架,并且我添加了不将创建的 dll 添加到 nuget 包中的选项。

 <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp2.1;net45</TargetFrameworks>
    <Version>1.0.30</Version>
  </PropertyGroup>
  <PropertyGroup>
    <IncludeBuildOutput>false</IncludeBuildOutput>
  </PropertyGroup>

为了将内容复制到 nuget 中,我添加了这些行:

<ItemGroup>
    <Content Include="XSD/**/*.xsd" copyToOutput="true">
      <IncludeInPackage>true</IncludeInPackage>
      <CopyToOutput>true</CopyToOutput>
      <BuildAction>Content</BuildAction>
      <copyToOutput>true</copyToOutput>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <Content Include="Messages.Voorbeeld/**/*.cs" copyToOutput="true">
      <IncludeInPackage>true</IncludeInPackage>
      <CopyToOutput>true</CopyToOutput>
      <BuildAction>Compile</BuildAction>
      <copyToOutput>true</copyToOutput>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

nuget 包中的 nuspec 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata>
    <id>XsdInclude</id>
    <version>1.0.30</version>
    <authors>XsdInclude</authors>
    <owners>XsdInclude</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package Description</description>
    <dependencies>
      <group targetFramework=".NETFramework4.5" />
      <group targetFramework=".NETCoreApp2.1" />
      <group targetFramework=".NETStandard2.0" />
    </dependencies>
    <contentFiles>
      <files include="any/net45/XSD/V202001/Voorbeeld/Common.xsd" buildAction="Content" />
      <files include="any/netcoreapp2.1/XSD/V202001/Voorbeeld/Common.xsd" buildAction="Content" />
      <files include="any/netstandard2.0/XSD/V202001/Voorbeeld/Common.xsd" buildAction="Content" />
      <files include="any/net45/XSD/V202001/Voorbeeld/Specific.xsd" buildAction="Content" />
      <files include="any/netcoreapp2.1/XSD/V202001/Voorbeeld/Specific.xsd" buildAction="Content" />
      <files include="any/netstandard2.0/XSD/V202001/Voorbeeld/Specific.xsd" buildAction="Content" />
      <files include="cs/net45/Messages.Voorbeeld/V202001/Common.cs" buildAction="Compile" />
      <files include="cs/netcoreapp2.1/Messages.Voorbeeld/V202001/Common.cs" buildAction="Compile" />
      <files include="cs/netstandard2.0/Messages.Voorbeeld/V202001/Common.cs" buildAction="Compile" />
      <files include="cs/net45/Messages.Voorbeeld/V202001/Voorbeeld.cs" buildAction="Compile" />
      <files include="cs/netcoreapp2.1/Messages.Voorbeeld/V202001/Voorbeeld.cs" buildAction="Compile" />
      <files include="cs/netstandard2.0/Messages.Voorbeeld/V202001/Voorbeeld.cs" buildAction="Compile" />
    </contentFiles>
  </metadata>
</package>

和包含 nuget 包的项目。assets.json 文件如下所示

{
  "version": 3,
  "targets": {
    ".NETCoreApp,Version=v3.1": {
      "XsdInclude/1.0.30": {
        "type": "package",
        "contentFiles": {
          "contentFiles/any/netcoreapp2.1/XSD/V202001/Voorbeeld/Common.xsd": {
            "buildAction": "Content",
            "codeLanguage": "any",
            "copyToOutput": false
          },
          "contentFiles/any/netcoreapp2.1/XSD/V202001/Voorbeeld/Specific.xsd": {
            "buildAction": "Content",
            "codeLanguage": "any",
            "copyToOutput": false
          },
          "contentFiles/cs/netcoreapp2.1/Messages.Voorbeeld/V202001/Common.cs": {
            "buildAction": "Compile",
            "codeLanguage": "cs",
            "copyToOutput": false
          },
          "contentFiles/cs/netcoreapp2.1/Messages.Voorbeeld/V202001/Voorbeeld.cs": {
            "buildAction": "Compile",
            "codeLanguage": "cs",
            "copyToOutput": false
          }
        }
      }
    }
  },
  "libraries": {
    "XsdInclude/1.0.30": {
      "sha512": "4MxqovEuuUlTmSxbgxcmsMnCF/6N1He6nPJ0FvvJ9l7588xiGKJgU4HtDktI66cKThpn+WsX5tzpm7K8HoRZ7A==",
      "type": "package",
      "path": "xsdinclude/1.0.30",
      "files": [
        ".nupkg.metadata",
        "content/Messages.Voorbeeld/V202001/Common.cs",
        "content/Messages.Voorbeeld/V202001/Voorbeeld.cs",
        "content/XSD/V202001/Voorbeeld/Common.xsd",
        "content/XSD/V202001/Voorbeeld/Specific.xsd",
        "contentFiles/any/net45/XSD/V202001/Voorbeeld/Common.xsd",
        "contentFiles/any/net45/XSD/V202001/Voorbeeld/Specific.xsd",
        "contentFiles/any/netcoreapp2.1/XSD/V202001/Voorbeeld/Common.xsd",
        "contentFiles/any/netcoreapp2.1/XSD/V202001/Voorbeeld/Specific.xsd",
        "contentFiles/any/netstandard2.0/XSD/V202001/Voorbeeld/Common.xsd",
        "contentFiles/any/netstandard2.0/XSD/V202001/Voorbeeld/Specific.xsd",
        "contentFiles/cs/net45/Messages.Voorbeeld/V202001/Common.cs",
        "contentFiles/cs/net45/Messages.Voorbeeld/V202001/Voorbeeld.cs",
        "contentFiles/cs/netcoreapp2.1/Messages.Voorbeeld/V202001/Common.cs",
        "contentFiles/cs/netcoreapp2.1/Messages.Voorbeeld/V202001/Voorbeeld.cs",
        "contentFiles/cs/netstandard2.0/Messages.Voorbeeld/V202001/Common.cs",
        "contentFiles/cs/netstandard2.0/Messages.Voorbeeld/V202001/Voorbeeld.cs",
        "xsdinclude.1.0.30.nupkg.sha512",
        "xsdinclude.nuspec"
      ]
    }
  },
  "projectFileDependencyGroups": {
    ".NETCoreApp,Version=v3.1": [
      "XsdInclude >= 1.0.30"
    ]
  },
  "packageFolders": {
    "C:\Users\xx\.nuget\packages\": {},
    "C:\Microsoft\Xamarin\NuGet\": {}
  },
  "project": {
    "version": "1.0.0",
    "restore": {
      "projectUniqueName": "D:\xx\Projects\Nugets\CoreTest\CoreTest.csproj",
      "projectName": "CoreTest",
      "projectPath": "D:\xx\Projects\Nugets\CoreTest\CoreTest.csproj",
      "packagesPath": "C:\Users\xx\.nuget\packages\",
      "outputPath": "D:\xx\Projects\Nugets\CoreTest\obj\",
      "projectStyle": "PackageReference",
      "fallbackFolders": [
        "C:\Microsoft\Xamarin\NuGet\"
      ],
      "configFilePaths": [
        "C:\Users\xx\AppData\Roaming\NuGet\NuGet.Config",
        "C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config",
        "C:\Program Files (x86)\NuGet\Config\Xamarin.Offline.config"
      ],
      "originalTargetFrameworks": [
        "netcoreapp3.1"
      ],
      "sources": {
        "C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\": {},
        "D:\xx\Projects\NugetServer": {},
        "https://api.nuget.org/v3/index.json": {}
      },
      "frameworks": {
        "netcoreapp3.1": {
          "projectReferences": {}
        }
      },
      "warningProperties": {
        "warnAsError": [
          "NU1605"
        ]
      }
    },
    "frameworks": {
      "netcoreapp3.1": {
        "dependencies": {
          "XsdInclude": {
            "target": "Package",
            "version": "[1.0.30, )"
          }
        },
        "imports": [
          "net461",
          "net462",
          "net47",
          "net471",
          "net472",
          "net48"
        ],
        "assetTargetFallback": true,
        "warn": true,
        "frameworkReferences": {
          "Microsoft.NETCore.App": {
            "privateAssets": "all"
          }
        },
        "runtimeIdentifierGraphPath": "C:\Program Files\dotnet\sdk\3.1.101\RuntimeIdentifierGraph.json"
      }
    }
  }
}

一定是小东西,但我找不到。谁能帮帮我?

通过将 cs 文件的 BuildAction 属性 从 'Compile' 更改为 'C# Compiler' 解决了问题。如果它是正确的我不确定。

通过这样做,生成的 nuspec 文件不再具有 cs 文件的 buildAction,但 json 文件仍然是使用 BuildAction="Compile" 创建的。

现在包含文件的目录都显示在 visual studio 中,并且 cs 文件已编译并可用。