如何在 Visual Studio 2017 为我创建的 NuGet 程序包中的 class 库旁边包含一个文本文件?

How do I include a text file alongside my class library in my NuGet package which Visual Studio 2017 is creating for me?

我的文本文件在我的 class 库项目中。如果较新,我将其构建操作设置为内容并将复制到输出目录设置为复制,因此 .csproj 有如下部分:

<ItemGroup>
  <Content Include="MyFile.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

我这样做是因为我需要使用我的 class 库中的文本文件,并且不能将其作为嵌入式资源,因为我想允许最终用户对其进行编辑。当我使用 VS 2017 创建包时,它会给我一个 .nuspec,其中包含如下部分:

<contentFiles>
  <files include="any/net46/MyFile.txt" buildAction="Content" />
  <files include="any/netstandard1.3/MyFile.txt" buildAction="Content" />
</contentFiles>

然后当我从另一个项目引用包时,MyFile.txt 出现在项目的根目录中,构建操作设置为内容但复制到输出目录设置为不复制。我只想将文件与 .dll 一起包含,而不包含在引用项目中。

如果您想保留 .nuspec,那么您可以手动编辑它并添加 copyToOutput="true" 属性。

如果您使用的是 VS2017 并且想要编辑您的 .csproj,那么您应该能够在您的 .csproj 文件中指定额外的元数据(并且您可以根据需要设置自定义构建操作):

<Content Include="MyFile.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <IncludeInPackage>true</IncludeInPackage>
    <BuildAction>Content</BuildAction>
    <CopyToOutput>true</CopyToOutput>
</Content>

以下内容将创建一个 nuget 包,当消费应用程序安装它时,它会将您选择的文件与包的 dll 一起保存,并且可以在 Visual Studio 2017 IDE 期间完全完成。 =40=]

假设您的解决方案中有一个名为 Foo.Bar 的 C# 项目,您希望将其构建到 nuget 包中:

在 Visual Studio 中,右键单击项目 Foo.Bar > Properties 并转到 Package 选项卡。确保 Package id: 的值为 Foo.Bar.

在与 Foo.Bar.csproj 文件相同的目录中创建一个 Foo.Bar.targets 文件,内容如下:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <None Include="$(MSBuildThisFileDirectory)\MyFile.txt">
      <Link>MyFile.txt</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

右击Visual Studio2017年的项目,selectEdit Foo.Bar.csproj。将以下块放入打开的项目文件中:

<ItemGroup>
    <None Include="MyFile.txt">
      <Pack>true</Pack>
      <PackagePath>build</PackagePath>
    </None>
    <None Include="Foo.Bar.targets">
      <Pack>true</Pack>
      <PackagePath>build</PackagePath>
    </None>
  </ItemGroup>

现在,当您右键单击该项目并 select Pack(或者如果您从项目所在目录中的命令行 运行 dotnet pack),它将为您的 Foo.Bar 项目生成一个 .nupkg 文件。 MyFile.txtFoo.Bar.targets 将在其中的 build 文件夹中。

作为测试,我将它安装到示例控制台应用程序项目中。这样做之后,MyFile.txt 出现在控制台应用程序的解决方案资源管理器中,可以打开和编辑。此外,如果我发布控制台应用程序,Foo.Bar.dllMyFile.txt 都在已发布文件的 bin > Release > [TargetFramework] > publish 文件夹中(如果使用文件夹配置文件发布到本地磁盘)。

需要注意的一件有趣的事情是,在撰写本文时,如果您在安装该软件包的控制台应用程序中右键单击 MyFile.txt,然后 select Properties,您将看到Copy to Output Directory 设置为 Always。如果我尝试将其更改为 Do Not Copy 或其他任何内容,尽管单击 OK,但当对话框关闭时,它将恢复为 Always。就像您每次都单击 Cancel 一样。这是因为对生成 nuget 包的原始 Foo.Bar.csproj 文件进行了编辑,特别是:<CopyToOutputDirectory>Always</CopyToOutputDirectory>.