msbuild - 如何将 NuGet contentFiles 提取到特定目录?
问题描述
到目前为止我已经尝试过:
我有以下 .nuspec 文件,定义了我的包(为了更好的可读性而进行了简化):
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
.
.
.
<dependencies/>
<contentFiles>
<files include="any\any\config\*.*" buildAction="None" copyToOutput="true" flatten="false"/>
</contentFiles>
</metadata>
<files>
<file src="bin\Assembly.dll" target="lib\net461" />
<file src="bin\Assembly.pdb" target="lib\net461" />
<file src="Config\cf.xml" target="contentFiles\any\any\config"/>
<file src="Config\cf.txt" target="contentFiles\any\any\config"/>
</files>
</package>
如您所见,它包含一个已编译的程序集及其调试符号文件以及子目录中的两个内容文件。
这会产生以下编译输出,其中将Assembly.dll提取到输出目录以及config子目录(其中包含两个 cf.* 文件):
问题:
我想要做的是将子目录配置在目录树中上移一步,所以它位于输出目录旁边- 基本上维护 .nuspec 文件中文件输入的结构(假设bin是输出目录我的 .csproj):
如何告诉 NuGet 包我希望将 contentFiles 提取到的确切位置?
解决方案
您可以通过创建一个 MSBuild 目标来实现此目的,该目标将您的config
文件夹移动到项目构建输出的上一级。
.targets
将具有以下内容的文件添加到 NuGet 的build\net461
文件夹:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Sets up items for target MoveConfigFiles, so that they can be used as Inputs and Outputs. -->
<Target Name="PrepareMoveConfigFiles" AfterTargets="Build">
<!-- ItemGroup wrapped in Target to delay evaluation of contained Items -->
<ItemGroup>
<!-- Contains source locations of files to be moved -->
<ConfigSourceFiles Include="$(OutputPath)\config\**\*.*" />
<!-- Contains target locations of files to be moved -->
<ConfigTargetFiles Include="@(ConfigSourceFiles->'%(FullPath)'->Replace('\config\', '\..\config\'))" />
</ItemGroup>
</Target>
<!-- Moves files from $(OutputPath)\config to $(OutputPath)\..\config,
then deletes $(OutputPath)\config. -->
<Target Name="MoveConfigFiles" AfterTargets="PrepareMoveConfigAndSqlFiles" Inputs="@(ConfigSourceFiles)" Outputs="@(ConfigTargetFiles)">
<Move SourceFiles="@(ConfigSourceFiles)" DestinationFiles="@(ConfigTargetFiles)" />
<RemoveDir Directories="$(OutputPath)\config" />
</Target>
</Project>
目标PrepareMoveConfigFiles
在目标之后执行Build
(保证 NuGet 的内容存在于构建输出中),并设置用作下一个目标的项Inputs
和Outputs
下一个MoveConfigFiles
目标的项。(项目设置在此目标内,以确保在Build
目标完成后对其进行评估。如果将项目定义放置在Project
级别以下,则它们将被更早地评估,因此可能为空,因为文件content
夹中的文件尚未已部署。)
该ConfigSourceFiles
项目仅包含源文件,并ConfigTargetFiles
采用所有路径ConfigSourceFiles
并替换\config\
为\..\config\
,从而导致所需的目标位置。
然后MoveConfigFiles
目标使用Move和RemoveDir任务来完成文件的移动和原始config
文件夹的删除。
推荐阅读
- php - 根据 Woocommerce 中的用户角色自定义客户新帐户邮件
- python - 为什么 Python Flask 应用程序仅在第二次重启后才呈现?
- node.js - 无法在 mongoose 中使用通用模型:“x”类型的参数不可分配给 MongooseFilterQuery 类型的参数
- here-api - /transit/Departures v8 缺少 APIKey 身份验证
- c - 如果我想长时间运行程序,如何忽略 SIGXCPU 信号?
- rxjs - 延迟不适用于观察者通过延迟时间?
- outlook-addin - Outlook 插件:更新 AppointmentItem.Body 会破坏 RTFBody
- reactjs - 如何将私有变量从 ReactJS 转换为 TypeScript?
- java - 使用java的嵌套#if宏处理
- scala - 过滤计数火花数据帧