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

时间:2017-06-12 11:46:15

标签: c# visual-studio-2017 nuget-package

我最近搬到了Visual Studio 2017社区版。它有2个不错的新功能

  1. 您不需要在csproj中明确包含您的源文件  自动执行此操作,
  2. 它可以直接构建nuget包。
  3. 我想将我的开源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文件夹。

    但是,当我在另一个项目中安装软件包时,内容文件不会显示,尽管它们列在project.assets.json文件夹的obj文件中。

5 个答案:

答案 0 :(得分:4)

我现在再次更改了我的项目文件,现在它显示为:

<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>

现在,在任何下载NuGet包的项目中,contentFiles已成功复制到同名文件夹(即contentFiles)中 - 不确定哪个指令有效,但其中一个指令有效。

不幸的是,在编译时,内容不会自动复制到项目的输出文件夹中 - 欢迎提出建议。

答案 1 :(得分:1)

包装&#34;内容&#34;和&#34; IncludeInPackage&#34;足以将文件复制到包中。

答案 2 :(得分:1)

首先,请注意,您需要根据引用nuget包的方式将文件放到content或contentFiles文件夹中。请参见此section的结尾。

基本上,如果package.config文件引用了nuget项目,则nuget包的content文件夹中的文件将被复制到引用项目。如果nuget包在项目文件中被PackageReference引用,则将使用该包内contentFiles文件夹中的文件。建议同时包含两者。

可以在here中找到contentFiles文件夹的结构。可以指定要复制的文件的语言和框架。

所以在您的情况下:

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

答案 3 :(得分:1)

我找到了解决方法。


下面的第一段代码不足以在目标应用程序上复制文件

<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>

这对我有用。希望它对您有用。

答案 4 :(得分:0)

以上内容

下面的图像具有我的项目contentFiles文件夹结构

Attached code image has my contentFiles folder structure

.csproj文件的设计

my .Csproj file