簡體   English   中英

如何在 Visual Studio 2017 中向 NuGet 包添加其他文件?

[英]How do you add additional files to a NuGet package in Visual Studio 2017?

我最近搬到了 Visual Studio 2017 社區版。 它有兩個不錯的新功能:

  1. 您不需要在 csproj 中明確包含您的源文件。 它會自動執行此操作。

  2. 它可以直接構建 NuGet 包。

我想將我的開源CodeFirstWebFramework DLL 打包為 NuGet 包。 除了包含DLL ,該包還必須包含其他文件(包括 .js、.tmpl、.css 和 .md 文件)的整個目錄樹。

我如何告訴 Visual Studio 我希望這個目錄樹包含在包中?

根據我通過廣泛搜索找到的信息,並忽略所有涉及將文件添加到 csproj 的過時信息,我能找到的只是將它們放在contentFiles文件夾中,但這似乎不起作用。

我的項目文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net45</TargetFramework>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
    <Authors>Nikki Locke</Authors>
    <Company>Trumphurst Ltd</Company>
    <Description>Easy to use web server for building web apps that use sql databases generated from c# classes</Description>
    <Copyright>2017 Trumphurst Ltd.</Copyright>
    <PackageProjectUrl>https://github.com/nikkilocke/CodeFirstWebFramework</PackageProjectUrl>
    <RepositoryUrl>https://github.com/nikkilocke/CodeFirstWebFramework</RepositoryUrl>
    <RepositoryType>Github</RepositoryType>
    <PackageTags>C# SQL Code First Web Server</PackageTags>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Markdig" Version="0.12.1" />
    <PackageReference Include="Mono.Data.Sqlite.Portable" Version="1.0.3.5" />
    <PackageReference Include="mustache-sharp" Version="0.2.10" />
    <PackageReference Include="MySql.Data" Version="6.9.9" />
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="System.Net" />
    <Reference Include="System.Web" />
  </ItemGroup>

</Project>

從網上的沖突和過時的信息中瘋狂地猜測我可能需要做什么,我添加了以下內容:

  <ItemGroup>
    <Content Include="contentFiles/**/*.*" copyToOutput="true">
      <IncludeInPackage>true</IncludeInPackage>
    </Content>
  </ItemGroup>

現在.nupkg文件中包含contentFiles文件夾的內容(在兩個位置,一個content文件夾和一個contentFiles文件夾)。

但是,當我在另一個項目中安裝該包時,雖然內容文件列在obj文件夾的project.assets.json文件中,但並未出現。

我現在再次更改了我的項目文件,因此它現在顯示為:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net45</TargetFramework>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
    <Authors>Nikki Locke</Authors>
    <Company>Trumphurst Ltd</Company>
    <Description>Easy to use web server for building web apps that use sql databases generated from c# classes</Description>
    <Copyright>2017 Trumphurst Ltd.</Copyright>
    <PackageProjectUrl>https://github.com/nikkilocke/CodeFirstWebFramework</PackageProjectUrl>
    <RepositoryUrl>https://github.com/nikkilocke/CodeFirstWebFramework</RepositoryUrl>
    <RepositoryType>Github</RepositoryType>
    <PackageTags>C# SQL Code First Web Server</PackageTags>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Markdig" Version="0.12.1" />
    <PackageReference Include="Mono.Data.Sqlite.Portable" Version="1.0.3.5" />
    <PackageReference Include="mustache-sharp" Version="0.2.10" />
    <PackageReference Include="MySql.Data" Version="6.9.9" />
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="System.Net" />
    <Reference Include="System.Web" />
  </ItemGroup>

  <ItemGroup>
    <Content Include="contentFiles/**/*.*" copyToOutput="true">
      <IncludeInPackage>true</IncludeInPackage>
      <CopyToOutput>true</CopyToOutput>
      <BuildAction>Content</BuildAction>
      <copyToOutput>true</copyToOutput>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <Compile Remove="Phone\**" />
    <EmbeddedResource Remove="Phone\**" />
    <None Remove="Phone\**" />
  </ItemGroup>

</Project>

現在, contentFiles 已成功復制到下載 NuGet 包的任何項目中的同名文件夾(即contentFiles )中 - 不確定哪個指令有效,但其中一個有效。

不幸的是,內容不會在編譯時自動復制到項目的輸出文件夾中 - 歡迎提出建議。

首先,請注意,您需要將文件放入 content 或 contentFiles 文件夾中,具體取決於引用 NuGet 包的方式。 請參閱本節末尾。

基本上,如果一個 NuGet 項目被 package.config 文件引用,NuGet 包內容文件夾中的文件將被復制到引用項目。 如果項目文件中的 PackageReference 引用了 NuGet 包,則將使用包內 contentFiles 文件夾中的文件。 建議兩者都包含。

contentFiles 文件夾的結構可以在這里找到。 可以為要復制的文件指定語言和框架。

所以在你的情況下:

<ItemGroup>
    <Content Include="contentFiles/**/*.*">
        <Pack>true</Pack>
        <PackagePath>contentFiles\any\any;content</PackagePath>
    </Content>
</ItemGroup>

我得到了解決方案。


下面的第一段代碼不足以復制目標應用程序上的文件

<ItemGroup>
<Content Include="contentFiles/**/*.*">
    <Pack>true</Pack>
    <PackagePath>contentFiles\any\any;content</PackagePath>
</Content>

解決方案-:這將復制根文件夾中的文件。

<ItemGroup>
<Content Include="contentFiles/**/*.*">
    <Pack>true</Pack>
    <PackagePath>contentFiles;content</PackagePath>
    <IncludeInPackage>true</IncludeInPackage>
    <CopyToOutput>true</CopyToOutput>
    <BuildAction>Content</BuildAction>
    <copyToOutput>true</copyToOutput>
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    <CopyToPublishDirectory>Always</CopyToPublishDirectory>
</Content>

這對我有用。 希望它對你有用。

包裝在“Content”和“IncludeInPackage”中足以將文件復制到包中。

除了以上

下圖有我的項目 contentFiles 文件夾結構

附加的代碼圖像具有我的 contentFiles 文件夾結構

我的 .csproj 文件的設計

我的 .Csproj 文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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