Msbuild 如何将NuGet contentFiles提取到特定目录? 到目前为止,我所尝试的:

Msbuild 如何将NuGet contentFiles提取到特定目录? 到目前为止,我所尝试的:,msbuild,nuget,Msbuild,Nuget,我得到了以下.nuspec文件,定义了我的包(简化以提高可读性): . . . 如您所见,它包含一个已编译的程序集及其调试符号文件以及子目录中的两个内容文件 这将产生以下编译输出,其中Assembly.dll被提取到输出目录以及config子目录(其中包含两个cf.*文件): 问题: 我想做的是在目录树中将子目录config向上移动一步,使其位于输出目录旁边-基本上保持.nuspec文件中输入的文件的结构(假设bin是my.csproj的输出目录): 我如何告诉NuGet软件包我希望内

我得到了以下.nuspec文件,定义了我的包(简化以提高可读性):


.
.
.
如您所见,它包含一个已编译的程序集及其调试符号文件以及子目录中的两个内容文件

这将产生以下编译输出,其中Assembly.dll被提取到输出目录以及config子目录(其中包含两个cf.*文件):


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


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

这是一个奇怪的问题

你有几件事要做一个nuspec文件

主要是“nuget包”。 您的nuspec产品线:

<file src="bin\Assembly.dll" target="lib\net461" />
<file src="bin\Assembly.pdb" target="lib\net461" />

我不理解Assembly.pdb如何分发它,但这并不重要

这一行的目标是在项目中分发您的DLL。 编译解决方案时(在解决方案目录中),它会在同一根应用程序目录中搜索此DLL,或者检查是否在系统上注册(主要是gac)

另一方面,其他类型的行是进入nuget的“内容”

<file src="Config\cf.xml" target="contentFiles\any\any\config"/>
<file src="Config\cf.txt" target="contentFiles\any\any\config"/>

这是额外的内容,但可能不会在项目中使用

如果需要路由系统,可以使用内容,但使用DLL时可能会遇到问题

所以,我想你可能会这样:

    <file src="bin\Assembly.dll" target="contentFiles\any\any\bin" />
    <file src="bin\Assembly.pdb" target="contentFiles\any\any\bin" />
    <file src="Config\cf.xml" target="contentFiles\any\any\config"/>
    <file src="Config\cf.txt" target="contentFiles\any\any\config"/>

以及其他nuspec示例(我不会这样做,但也可以这样做):



我希望我已经帮助了

您可以通过创建将
config
文件夹移动到项目生成输出之上一级的MSBuild目标来实现这一点

将包含以下内容的
.targets
文件添加到NuGet的
build\net461
文件夹中:


目标
PrepareMoveConfigFiles
Build
目标之后执行(这保证了NuGet的内容存在于Build输出中),并设置用作下一个
MoveConfigFiles
目标的
输入和
输出的项。(项目设置在此目标内,以确保在
构建
目标完成后对其进行评估。如果项目定义将置于
项目
级别之下,则会更早对其进行评估,因此可能为空,因为
内容
文件夹的文件尚未部署。)

ConfigSourceFiles
项仅包含源文件,
ConfigTargetFiles
获取所有
ConfigSourceFiles
的路径,并将
\config\
替换为
\..\config\
,从而找到所需的目标位置


然后,
MoveConfigFiles
目标使用和任务来完成文件的移动和原始
config
文件夹的删除。

但是
src
是nuspec()的源/输入。要移动
config
文件夹,您可能需要更新
.csproj
文件而不是
nuspec
谢谢,但这不是我想要的。我想要:1。将NuGet包中的
Assembly.dll
提取到生成输出中。这已经起作用了。2.将
config
文件夹及其内容提取到构建输出之上一个级别。这目前不起作用。相反,
config
是在构建输出中创建的。也许我错了,但我认为这是不可能的。因为输出编译目录不在nuget包中。您可以修改它的csproj($OutputPath)。正如@Renat所说的……免责声明:通过在YouTube上观看great Give,扩展了我的MSBuild知识,这一切都成为可能。非常感谢!由于我是MSBuild的新手,因此非常欢迎提出建议:-)
<files>
    <file src="content\bin\youtBinayFile" target="content\bin\youtBinayFile" />
    <file src="content\Config\YourConfigFile" target="content\Config\YourConfigFile" />
    <file src="readme.txt" target="readme.txt" />
</files>