如何在 Visual Studio 2017 为我创建的 NuGet 包中与类库一起包含一个文本文件?



我的文本文件在我的类库项目中。我将其构建操作设置为内容,并将复制到输出目录设置为复制(如果较新),因此.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.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 > 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>

最新更新