我们需要构建这些项目,它们有一些奇怪的做法。它们依赖于作为另一个项目的构建过程的结果生成的链接代码文件。这些项目位于一个子文件夹中。
因此,在构建我们的项目之前,我们需要构建子项目。这是通过向每个项目的 BeforeBuild 目标添加自定义构建目标来完成的,并且似乎有效。但是,如果没有恢复其 NuGet 依赖项,子项目将无法构建。
澄清一下:我们知道这种模式完全是疯狂的,但我们没有人力来重构每个使用这种模式的项目。我们只是想让它们一步可靠地编译。
这些外部项目依赖项中的每一个都列在自定义 ItemGroup 中,如下所示:
<ItemGroup>
<ExternalDependantProjects Include= "..\<subfolder>\<project>\<project>.csproj" />
</ItemGroup>
我们一直在尝试通过添加由每个项目的 BeforeBuild 目标调用的自定义构建目标来解决这个问题。我们首先尝试使用 ResolveNuGetPackageAssets 作为构建目标,但发现这仅在 netcore 中受支持,而我们的目标是 net47。
现在我们正在尝试编写一个自定义构建目标,该目标将恢复外部项目中的 NuGet 依赖项。我们尝试了直截了当的方法,如下所示:<Exec Command="nuget restore @(ExternalDependantProjects)" />
以及更复杂和更骇人听闻的 PowerShell 尝试:<Exec Command="powershell.exe -command "'@(ExternalDependantProjects, '' '')' | foreach { nuget restore $_ }"" />
在这两种情况下,它都只是尝试恢复主项目的包,而不是外部项目。@(ExternalDependantProjects) 似乎等于空白,因此没有添加新参数。使用表明 @(ExternalDependantProjects) 不返回任何内容。但是,当我们调用 MSBuild“构建”目标时,它确实可以用作“项目”参数。所以,我怀疑我们以错误的方式使用 Item 参数?也许有一些语法可以访问 Item 的 Include 属性?
但是,如果我们能够解决该问题,我不确定它是否会起作用。我们在子项目上使用 nuget restore 命令进行了测试,总是得到packages.conf中所有包都安装的响应。然而,来自该外部项目的 ..\packages\ 是空的,并且 packages.conf 指定了六个包(它们也从 VS 的“引用”中丢失,并且引用的 HintPath 正确地转到了 ..\packages)。
所以我们在三个方面感到困惑:我们如何引用来自 MSBuild 目标的 ExternalDependentProjects 项包含路径,为什么 NuGet 恢复 CLI 不起作用,这甚至是解决此问题的正确方法吗?我们是否完全走错了路?