![](/img/trans.png)
[英]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.