【发布时间】:2018-04-15 06:19:02
【问题描述】:
我们需要构建这些项目,它们有一些奇怪的做法。它们依赖于作为另一个项目的构建过程的结果生成的链接代码文件。这些项目位于一个子文件夹中。
因此,在构建我们的项目之前,我们需要构建子项目。这是通过向每个项目的 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 &quot;&apos;@(ExternalDependantProjects, '&apos; &apos;')&apos; | foreach { nuget restore $_ }&quot;" />
在这两种情况下,它只是尝试恢复主项目的包,而不是外部项目。 @(ExternalDependantProjects) 似乎等于空白,因此没有添加新参数。使用表明 @(ExternalDependantProjects) 不返回任何内容。但是,当我们调用 MSBuild“构建”目标时,它确实可以用作“项目”参数。所以,我怀疑我们以错误的方式使用 Item 参数?也许有一些语法可以访问 Item 的 Include 属性?
但是,如果我们能够解决该问题,我不确定它是否会起作用。我们在子项目上使用 nuget restore 命令进行了测试,总是得到packages.conf中所有包都安装的响应。然而,来自该外部项目的 ..\packages\ 是空的,并且 packages.conf 指定了六个包(它们也从 VS 的“引用”中丢失,并且引用的 HintPath 正确地转到了 ..\packages)。
所以我们在三个方面感到困惑:我们如何引用来自 MSBuild 目标的 ExternalDependentProjects 项包含路径,为什么 NuGet 恢复 CLI 不起作用,这甚至是解决此问题的正确方法吗?我们是不是完全走错了路?
【问题讨论】:
-
为什么这需要被黑客入侵并不明显。就像其他任何项目一样,让它成为一个正常的项目。您所要做的就是确保它先于其他构建。 MSBuild 可能无法自行解决此问题,因此您必须提供帮助。右键单击解决方案节点并选择项目依赖项。
-
@Jansky,这个问题呢?这个问题解决了吗?如果没有,请告诉我有关此问题的最新信息吗?
-
嘿@Leo-MSFT,我非常感谢您在回复中付出的所有努力。它给了我一些很好的解决方案。但是我已经被转移到另一个项目,不确定何时/是否有时间解决这个问题。无论如何,我暂时将您的答案标记为答案。
标签: visual-studio msbuild nuget msbuild-task nuget-cli