gpt4 book ai didi

msbuild - 如何将 NuGet contentFiles 提取到特定目录?

转载 作者:行者123 更新时间:2023-12-03 17:13:33 25 4
gpt4 key购买 nike

到目前为止我尝试过的:

我有以下 .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.* 文件):

actual build output

题:

我想要做的是将子目录 config 在目录树中向上移动一级,因此它位于输出目录旁边 - 基本上保持 .nuspec 文件中文件输入的结构(假设 bin 是我的.csproj):

nuspec directory structure desired build output

如何告诉 NuGet 包我希望将内容文件提取到的确切位置?

最佳答案

您可以通过创建移动您的 config 的 MSBuild 目标来实现这一点。文件夹比项目构建输出高一级。
添加 .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>
目标 PrepareMoveConfigFilesBuild 之后执行目标(保证 NuGet 的内容存在于构建输出中),并设置用作 Inputs 的项目和 Outputs下一个 MoveConfigFiles目标。 (项目设置在此目标内以确保在 Build 目标完成后评估它们。如果项目定义将放置在 Project 级别之下,它们将更早评估,因此可能为空,因为文件的 content 文件夹尚未部署。) ConfigSourceFiles item 只包含源文件,而 ConfigTargetFiles取所有 ConfigSourceFiles 的路径并替换 \config\\..\config\ ,这会导致所需的目标位置。 MoveConfigFiles目标然后使用 MoveRemoveDir完成文件移动和删除原始文件的任务 config文件夹。

关于msbuild - 如何将 NuGet contentFiles 提取到特定目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57162354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com