C# 如何在Visual Studio 2017中将其他文件添加到NuGet软件包中?

C# 如何在Visual Studio 2017中将其他文件添加到NuGet软件包中?,c#,visual-studio-2017,nuget-package,C#,Visual Studio 2017,Nuget Package,我最近搬到了Visual Studio 2017社区版。它有两个不错的新功能: 您不需要在csproj中显式地包含源文件。它会自动执行此操作 它可以直接构建NuGet包 我想把我的开源CodeFirstWebFrameworkDLL打包成一个NuGet包。除了包含DLL,软件包还必须包含其他文件(包括.js、.tmpl、.css和.md文件)的完整目录树 如何告诉Visual Studio我希望在包中包含此目录树 根据我通过广泛搜索找到的信息,并忽略所有涉及向csproj添加文件的过时信息,

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

  • 您不需要在csproj中显式地包含源文件。它会自动执行此操作

  • 它可以直接构建NuGet包

  • 我想把我的开源
    CodeFirstWebFramework
    DLL打包成一个NuGet包。除了包含
    DLL
    ,软件包还必须包含其他文件(包括.js、.tmpl、.css和.md文件)的完整目录树

    如何告诉Visual Studio我希望在包中包含此目录树

    根据我通过广泛搜索找到的信息,并忽略所有涉及向csproj添加文件的过时信息,我所能找到的只是将它们放在
    contentFiles
    文件夹中,但这似乎不起作用

    我的项目文件如下所示:

    
    网络45
    真的
    尼克洛克
    特朗普赫斯特有限公司
    易于使用的web服务器用于构建使用c#类生成的sql数据库的web应用程序
    2017特朗普赫斯特有限公司。
    https://github.com/nikkilocke/CodeFirstWebFramework
    https://github.com/nikkilocke/CodeFirstWebFramework
    github
    C#SQL代码优先Web服务器
    
    我从网上相互冲突和过时的信息中疯狂地猜测我可能需要做什么,我添加了以下内容:

    
    真的
    
    现在,
    .nupkg
    文件中有
    contentFiles
    文件夹的内容(在两个地方,一个是
    content
    文件夹,另一个是
    contentFiles
    文件夹)


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

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

    
    网络45
    真的
    尼克洛克
    特朗普赫斯特有限公司
    易于使用的web服务器用于构建使用c#类生成的sql数据库的web应用程序
    2017特朗普赫斯特有限公司。
    https://github.com/nikkilocke/CodeFirstWebFramework
    https://github.com/nikkilocke/CodeFirstWebFramework
    github
    C#SQL代码优先Web服务器
    真的
    真的
    内容
    真的
    总是
    
    内容文件现在已成功复制到下载NuGet软件包的任何项目中的同名文件夹(即
    contentFiles
    )中-不确定哪个指令有效,但其中一个有效


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

    用“内容”和“IncludeInPackage”包装足以将文件复制到包中

    首先,请注意,您需要根据NuGet软件包的引用方式将文件放入content或contentFiles文件夹中。见下文

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

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

    因此,在你的情况下:

    
    真的
    contentFiles\any\any;内容
    
    我找到了解决方案


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

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

    解决方案-:这将复制根文件夹上的文件

    <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>
    
    
    真的
    内容文件;内容
    真的
    真的
    内容
    真的
    总是
    总是
    

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

    除上述内容外

    下图是我的项目内容文件文件夹结构

    mycsproj文件的设计


    您不需要在csproj中显式地包含源文件,它会自动执行此操作,并且它可以直接构建nuget包-您从哪里读到的?此doco(它是一个.net核心示例,不确定您是否以完整为目标)有几个步骤您是否已将DLL添加到project and Build Output Dir或在csproj中引用了它?例如,“您是否已将DLL添加到project and Build Output Dir或在csproj中引用了它?”-不理解此问题。什么dll?看起来您正在使用.Net Core,dll是否作为依赖项引用?(有时,当您使用非托管DLL时,您会将它们添加到project中,而不是通过引用,而只是添加文件,并将build设置为output,使其最终位于bin文件夹中)。你从哪里得到了我提供的链接?顺便说一句,你评论中的文章清楚地说:免责声明:这只适用于一小部分项目类型。类库项目控制台应用ASP.NET核心web应用.NET核心-我猜你的是类库,对吗?谢谢你的回复。您能告诉我为什么建议同时包含
    contentFiles
    content
    文件夹吗?消费项目中引用nuget软件包的方式决定了使用哪个文件夹。因此,为了使您的包通过两种引用方式都可用,建议同时添加这两种方式。>在编译时,内容不会自动复制到项目的输出文件夹中,不幸的是-欢迎建议@Nikki Locke看一看,您需要添加未记录的
    PackageCopyToOutput
    开关,以便在引用nuget内容文件的项目中将其标记为“CopyToOutput”:“true”```