如何在 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.txt
和 Foo.Bar.targets
将在其中的 build
文件夹中。
作为测试,我将它安装到示例控制台应用程序项目中。这样做之后,MyFile.txt
出现在控制台应用程序的解决方案资源管理器中,可以打开和编辑。此外,如果我发布控制台应用程序,Foo.Bar.dll
和 MyFile.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>
.
我的文本文件在我的 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.txt
和 Foo.Bar.targets
将在其中的 build
文件夹中。
作为测试,我将它安装到示例控制台应用程序项目中。这样做之后,MyFile.txt
出现在控制台应用程序的解决方案资源管理器中,可以打开和编辑。此外,如果我发布控制台应用程序,Foo.Bar.dll
和 MyFile.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>
.