【问题标题】:How do I include a text file alongside my class library in my NuGet package which Visual Studio 2017 is creating for me?如何在 Visual Studio 2017 为我创建的 NuGet 包中包含我的类库旁边的文本文件?
【发布时间】:2021-05-13 07:09:55
【问题描述】:

我的文本文件在我的类库项目中。我将其构建操作设置为内容并将复制到输出目录设置为复制(如果更新),因此 .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 会出现在项目的根目录中,其中 Build Action 设置为 Content,但 Copy to Output Directory 设置为 Do not copy。我只想将文件与 .dll 一起包含,而不是包含在引用项目中。

【问题讨论】:

    标签: msbuild nuget visual-studio-2017 csproj


    【解决方案1】:

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

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

    在 Visual Studio 中,右键单击项目 Foo.Bar &gt; 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 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 &gt; Release &gt; [TargetFramework] &gt; publish 文件夹中(如果使用文件夹配置文件发布到本地磁盘)。

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

    【讨论】:

    • 嗨,我对我的 csproj 文件的确切配置有点挣扎。有资料吗?
    • 我的上述回答使用了以下页面的“在包中包含内容”部分提供的一些示例:github.com/NuGet/Home/wiki/…。至于我上面的回答,要成为 nuget 包的 csproj 文件需要在 Project 节点中向下一层的 ItemGroup 节点(当您在 Visual Studio 中右键单击 csproj 并选择“Edit .csproj”时)。
    【解决方案2】:

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2017-11-13
    • 2019-02-14
    • 2020-05-04
    相关资源
    最近更新 更多