如何在 Visual Studio 2017 为我创建的 NuGet 包中包含我的类库旁边的文本文件?

use*_*558 6 msbuild csproj nuget visual-studio-2017

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

<ItemGroup>
  <Content Include="MyFile.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

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

<contentFiles>
  <files include="any/net46/MyFile.txt" buildAction="Content" />
  <files include="any/netstandard1.3/MyFile.txt" buildAction="Content" />
</contentFiles>
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*son 7

下面将创建一个 nuget 包,当消费应用程序安装它时,它将您选择的文件与包的 dll 一起保存,并且可以完全通过 Visual Studio 2017 IDE 完成。

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

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

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

<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>
Run Code Online (Sandbox Code Playgroud)

在 Visual Studio 2017 中右键单击该项目,然后选择Edit 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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