当通过Nuget安装时,.Net核心解决方案中的Nuget内容文件未被复制。

13

我无法将静态文件的内容复制到我的 .Net Core Web 应用程序项目中,这些文件是在使用 NuGet 包资源编辑器创建 NuGet 包时添加的。同样的操作在 .Net Framework 项目模板中可以正确地完成,但在 .Net Core 模板中却不能。我使用的是 VS 2015 更新 3。我需要做什么才能解决这个问题?非常感谢您的帮助。

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

输入图片描述

4个回答

10

关于这个问题,有一个NuGet博客文章,目前不支持此功能。

支持的项目类型

此功能仅适用于通过project.json文件管理的项目将安装的软件包。目前,只有两种项目类型由project.json管理。

  • UWP应用程序
  • 可移植类库

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

非常遗憾基本功能已从.NET Core项目中删除。特别是因为支持PCL,它是.NET Core项目的子集。

Github上有很多相关问题,目前还不清楚这个功能是否会很快回来。


1
感谢您的解释。这真的很遗憾,因为我相信很多时候我们确实需要打包文件,即必要的模板或支持文件。希望他们能尽快获得这个功能。对于我们来说,这将是一场噩梦,因为我们在组织内的项目中非常依赖NuGet打包。 - Joshua I
2
直到今天,以前可用的BASIC功能仍未恢复!这对生产力构成了阻碍。 - Lord of Scripts
有没有人对此有好的解决方案?我需要安装一个包含内容的Nuget包。该包含一个文件夹,其中包含许多内容文件,可以将其添加到针对.NET Core 2的项目中。 - Rob L
1
似乎它仍然不起作用...这非常糟糕。这是一个有用的功能。 - Major

6
似乎仍不支持。唯一的“hack”方法是使用MSBuild Targets和Build事件。
根据this文档:
构建 MSBuild .targets 和 .props 文件自动插入到项目文件或 project.lock.json(NuGet 3.x+)中。
因此,为了使其与任何文件一起工作,例如:将 "config.xml" 作为 Nuget 静态内容:
1. 创建您的 XY.nuspec 文件(通常情况下) 2. 将 config.xml 包含到 Nuget 中:<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目标将成为Cached软件包的一部分,并在每次构建时运行(当前在构建之前)。
这种解决方案存在以下问题:
- 添加的文件仍然链接到构建解决方案之前。在构建阶段(BeforeTargets=""),文件被复制。在此之前,这些文件仍然只是链接! - 如果您设置内容文件具有构建操作并将其复制到项目的输出目录中,则这些设置将丢失!
不幸的是,这现在是最好的解决方案。

棒极了的答案!我正在使用 Restore 目标而不是 PreBuildEvent 将文件复制到包使用方项目中,效果非常好。 - ViRuSTriNiTy
我撤回了Restore目标语句,它不可靠,似乎只有在使用dotnet restore或项目的第一次构建时才有效。 - ViRuSTriNiTy
当使用 dotnet pack 时,您可以将所有属性都包含在项目文件中,而不是使用单独的 .nuspec 文件。 - ViRuSTriNiTy

0

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

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

4
这并没有解决与特定问题相关的任何问题。 - Teoman shipahi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接