[英]How can I include a NuGet package with native dlls in my new CSPROJ Class Library?
[英]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.txt
和Foo.Bar.targets
将位于其中的build
文件夹中。
作为测试,我将其安装到示例控制台应用程序项目中。 执行此操作后, MyFile.txt
将出现在控制台应用程序的解决方案资源管理器中,并且可以打开和编辑。 此外,如果我发布控制台应用程序, Foo.Bar.dll
和MyFile.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.