0

我们需要构建这些项目,它们有一些奇怪的做法。它们依赖于作为另一个项目的构建过程的结果生成的链接代码文件。这些项目位于一个子文件夹中。

因此,在构建我们的项目之前,我们需要构建子项目。这是通过向每个项目的 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 不起作用,这甚至是解决此问题的正确方法吗?我们是否完全走错了路?

4

2 回答 2

1

NuGet 发现 packages.config 项目以从解决方案文件中还原。如果所有项目都在解决方案文件中并且您运行nuget.exe restore <solution file>它们应该得到恢复,无论项目文件中发生了什么。

作为任何自定义方案的解决方法,您可以编写一个脚本来发现文件夹中的所有 packages.config 文件,然后nuget.exe restore <packages.config> -SolutionDirectory <solution root>直接调用这些文件。对于 packages.config 恢复,唯一需要的部分是从 packages.config 文件中发现 id/versions 列表,以便可以将它们下载并提取到解决方案级别的 packages 文件夹。

我还建议使用项目引用ReferenceOutputAssembly=false来确保项目按照您想要的顺序构建,并且不相互引用。请参阅:https ://blogs.msdn.microsoft.com/kirillosenkov/2015/04/04/how-to-have-a-project-reference-without-referencing-the-actual-binary/

于 2017-11-03T05:12:45.660 回答
1

我们如何引用来自 MSBuild 目标的 ExternalDependentProjects 项包含路径,为什么 NuGet 恢复 CLI 不起作用,这甚至是解决此问题的正确方法吗?我们是否完全走错了路?

您应该使用选项编写自定义构建目标-OutputDirectory,因此自定义构建目标应如下所示:

  <Target Name="BeforeBuild">
      <Exec Command="nuget restore @(ExternalDependantProjects) -OutputDirectory ..\<subfolder>\packages" />
  </Target>

使用此目标,外部项目的 NuGet 包将成功恢复。

此外, 的值@(ExternalDependantProjects)不等于空白,可以使用目标回显该值。

以下是我的测试样本,您可以参考一些详细信息:

ExternalpProject是子文件夹名称,TestExternalProject是外部项目名称。

<ItemGroup>
  <ExternalDependantProjects Include= "..\ExternalpProject\TestExternalProject\TestExternalProject.csproj" />
</ItemGroup> 

<Target Name="BeforeBuild">
  <Message Text="Restore package for Externalp Project" Importance="high"></Message>
  <Exec Command="nuget restore @(ExternalDependantProjects) -OutputDirectory ..\ExternalpProject\packages" />
</Target>

<Target Name="AfterBuild">
  <Message Text="Display the value of ExternalDependantProjects" Importance="high"></Message>
  <Message Text="@(ExternalDependantProjects)"></Message>
</Target>

在此处输入图像描述

于 2017-11-06T11:58:02.420 回答