【问题标题】:Nuget Content Files in .Net core solution not getting copied when installing through Nuget通过 Nuget 安装时,.Net 核心解决方案中的 Nuget 内容文件不会被复制
【发布时间】:2017-03-21 00:36:44
【问题描述】:

我无法复制我在使用 nuget 包资源管理器创建 nuget 包时添加的 .Net 核心 Web 应用程序项目中的内容静态文件。在 .Net 框架项目模板中正确复制了相同的内容,但在 .net 核心模板中却没有。我正在使用 VS 2015 更新 3。我在这里缺少什么吗?任何帮助将不胜感激。

下面是我的内容文件结构快照。

【问题讨论】:

    标签: asp.net-core nuget nuget-package


    【解决方案1】:

    有一个nuget blog post 与此相关,但目前不支持。

    支持的项目类型

    此功能仅适用于将安装到使用 project.json 文件管理的项目的包。目前只有两个项目类型由 project.json 管理。

    • UWP 应用
    • 可移植类库

    contentFiles 选项不适用于其他项目类型

    很遗憾,这个基本功能已被排除在 .net Core 项目之外。特别是因为支持 PCL,它是 .net Core 项目的子集。

    GitHub 上有很多关于此的问题,目前尚不清楚此功能是否会很快恢复。

    【讨论】:

    • 感谢您的解释.. 这真的很可悲,因为我相信很多时候我们确实需要打包文件,即模板或必要的支持文件.. 希望他们尽快获得此功能.. 这将是一场噩梦我们,因为我们在组织内的项目中非常依赖 nuget 打包。
    • 到目前为止,之前可用的基本功能尚未恢复!这是生产力的障碍。
    • 有没有人有解决这个问题的好方法?我需要安装一个包含内容的 Nuget 包。该包包含一个文件夹,其中包含许多内容文件到一个以 .NET Core 2 为目标的项目中
    • 它似乎仍然无法正常工作......这很糟糕。这是一个有用的功能。
    【解决方案2】:

    它似乎仍然不受支持。 “破解”它的唯一方法是使用 MSBuild 目标和构建事件。

    根据this 文档:

    构建
    MSBuild .targets.props 文件自动插入 项目文件或 project.lock.json (NuGet 3.x+)。

    因此要使其适用于任何文件,例如:“config.xml”作为 Nuget 静态内容:

    1. 创建您的 XY.nuspec 文件(像往常一样)
    2. 在 Nuget 中包含 config.xml:<file src="config.xml" target="contentFiles\any\any\config.xml" />
    3. 添加新的 .targets 文件 XY.targets
    4. 将新的 XY.targets 文件包含到您的包中的“build”文件夹中。 <file src="XY.targets" target="build"/>

    XY.targets 文件的内容

    <?xml version="1.0" encoding="utf-8"?>
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <ContentFilesPath>$(MSBuildThisFileDirectory)..\contentFiles\any\any\</ContentFilesPath>
      </PropertyGroup>
      <Target Name="CopyConfigs" BeforeTargets="PreBuildEvent">
        <Copy SourceFiles="$(ContentFilesPath)\config.xml" DestinationFiles="$(ProjectDir)config.xml" SkipUnchangedFiles="true" Condition="!Exists('$(ProjectDir)config.xml')"></Copy>
      </Target>
    </Project>
    

    打包和安装 Nuget 后,此 MSBuild 目标将成为缓存包的一部分,并将在每次构建时运行(当前在构建之前)。

    此解决方案存在的问题:

    • 在您构建解决方案之前,添加的文件仍然链接。在构建阶段 (BeforeTargets="") 文件被复制。直到这个文件仍然只是链接!!!
    • 如果您将内容文件设置为具有构建操作并复制到项目的输出目录,这些设置将会丢失!

    不幸的是,这是目前最好的解决方案。

    【讨论】:

    • 很棒的答案!我使用Restore 目标而不是PreBuildEvent 将文件复制到包消费者项目,就像一个魅力。
    • 我收回了Restore 目标语句,它不能可靠地工作,似乎它只在使用dotnet restore 或在项目的第一次构建时才有效。
    • 在使用dotnet packdocs.microsoft.com/en-us/nuget/reference/…时,您可以在项目文件中包含所有属性,而不是使用单独的.nuspec文件。
    【解决方案3】:

    【讨论】:

    • 我遇到了同样的问题,无法解决。这很糟糕。查看链接的存储库,我认为 NUnit 不会复制任何静态文件。这些是引用并复制到构建输出的 .DLL。然而 Selenium 做了一些非常奇怪的事情......我不知道它是如何工作的。
    【解决方案4】:

    读完这篇文章后,我想出了一个解决方法。我创建了一个 .Net 程序集项目并将其从所有内容中完全清空。然后我将项目移动到与 .Net Core Web 应用程序的项目相同的目录中。我没有从 Web 应用程序添加 NuGet 包引用,而是从 .Net 程序集项目添加它。所有文件都正确复制到目录中并自动添加到 Web 项目中,因为它们共享同一个目录。这个解决方案感觉很脏,但它允许我使用 .Net Core Web 项目的 NuGet 包管理静态文件。

    【讨论】:

    • 这不能解决与特定问题相关的任何问题。
    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2020-11-07
    • 1970-01-01
    • 2018-09-05
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多