簡體   English   中英

如何在 Visual Studio 2017 為我創建的 NuGet 包中包含我的類庫旁邊的文本文件?

[英]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.txtFoo.Bar.targets將位於其中的build文件夾中。

作為測試,我將其安裝到示例控制台應用程序項目中。 執行此操作后, MyFile.txt將出現在控制台應用程序的解決方案資源管理器中,並且可以打開和編輯。 此外,如果我發布控制台應用程序, Foo.Bar.dllMyFile.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM