【发布时间】:2017-03-21 00:36:44
【问题描述】:
我无法复制我在使用 nuget 包资源管理器创建 nuget 包时添加的 .Net 核心 Web 应用程序项目中的内容静态文件。在 .Net 框架项目模板中正确复制了相同的内容,但在 .net 核心模板中却没有。我正在使用 VS 2015 更新 3。我在这里缺少什么吗?任何帮助将不胜感激。
下面是我的内容文件结构快照。
【问题讨论】:
标签: asp.net-core nuget nuget-package
我无法复制我在使用 nuget 包资源管理器创建 nuget 包时添加的 .Net 核心 Web 应用程序项目中的内容静态文件。在 .Net 框架项目模板中正确复制了相同的内容,但在 .net 核心模板中却没有。我正在使用 VS 2015 更新 3。我在这里缺少什么吗?任何帮助将不胜感激。
下面是我的内容文件结构快照。
【问题讨论】:
标签: asp.net-core nuget nuget-package
有一个nuget blog post 与此相关,但目前不支持。
支持的项目类型
此功能仅适用于将安装到使用 project.json 文件管理的项目的包。目前只有两个项目类型由 project.json 管理。
- UWP 应用
- 可移植类库
contentFiles 选项不适用于其他项目类型。
很遗憾,这个基本功能已被排除在 .net Core 项目之外。特别是因为支持 PCL,它是 .net Core 项目的子集。
GitHub 上有很多关于此的问题,目前尚不清楚此功能是否会很快恢复。
【讨论】:
它似乎仍然不受支持。 “破解”它的唯一方法是使用 MSBuild 目标和构建事件。
根据this 文档:
构建
MSBuild .targets 和 .props 文件自动插入 项目文件或 project.lock.json (NuGet 3.x+)。
因此要使其适用于任何文件,例如:“config.xml”作为 Nuget 静态内容:
<file src="config.xml" target="contentFiles\any\any\config.xml" />
<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 目标将成为缓存包的一部分,并将在每次构建时运行(当前在构建之前)。
此解决方案存在的问题:
不幸的是,这是目前最好的解决方案。
【讨论】:
Restore 目标而不是PreBuildEvent 将文件复制到包消费者项目,就像一个魅力。
Restore 目标语句,它不能可靠地工作,似乎它只在使用dotnet restore 或在项目的第一次构建时才有效。
dotnet packdocs.microsoft.com/en-us/nuget/reference/…时,您可以在项目文件中包含所有属性,而不是使用单独的.nuspec文件。
【讨论】:
读完这篇文章后,我想出了一个解决方法。我创建了一个 .Net 程序集项目并将其从所有内容中完全清空。然后我将项目移动到与 .Net Core Web 应用程序的项目相同的目录中。我没有从 Web 应用程序添加 NuGet 包引用,而是从 .Net 程序集项目添加它。所有文件都正确复制到目录中并自动添加到 Web 项目中,因为它们共享同一个目录。这个解决方案感觉很脏,但它允许我使用 .Net Core Web 项目的 NuGet 包管理静态文件。
【讨论】: