繁体   English   中英

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

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

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

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

我这样做是因为我需要使用我的类库中的文本文件,并且不能将其作为嵌入式资源,因为我希望允许最终用户对其进行编辑。 当我使用 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 旁边,而不是包含在引用项目中。

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

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

在 Visual Studio 中,右键单击项目Foo.Bar > Properties并转到Package选项卡。 确保Package id:的值是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>

在 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>

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM