诱饵和交换机的

时间:2017-11-29 16:59:57

标签: .net msbuild .net-core visual-studio-2017

所以我有一个具有以下结构的项目:

syntax: Project (Assembly Name) - P1 (Assembly-1) - P2.A (Assembly-2) - P2.B (Assembly-2) - P3 (Assembly-3)

其中一点是便于诱饵和切换,其中P2.A和P2.B都具有相同的组件名称。

Proj依赖是这样的,P3是其他一切的依赖。 P1是一个净标准项目,依赖于P2.A(诱饵),并且组件在预期的各个平台上与P2.B交换

现在在单元测试项目中,在这个解决方案中,我不依赖于nuget包,而是直接在项目上,我有一个UnitTest项目,取决于P1,P2.B,P3。

当我在visual studio中编译它时,它按预期工作(即使这部分似乎有风险,如何从P2.B的程序集是最后一个转移到输出文件夹而不是P2.A,P1依赖于,但无论如何这有效的原因)。但是,如果我尝试从命令行执行dotnet build,它就会失败error : Cannot find project info for '**\P2.A.csproj'. This can indicate a missing project reference.我猜测项目P2.A和P2.B之间的程序集名称相同起来,不知道如何解决这个问题。

如果我直接从P2.B中删除单元测试项目,它也可以在命令行中正常工作,但是我们只剩下诱饵dll。

不确定为什么行为与visual studio和命令行不同。

我也尝试通过删除对P2.B的直接依赖来解决这个问题,而是为AfterTargets =“Build”设置msbuild Target以触发P2.B的构建并相应地提供输出路径作为单元测试项目输出文件夹。这种方式适用于切换确实发生且dotnet build/test正常工作的情况。但是使用指定的运行时构建然后失败error : Assets file '**\P2.B\obj\project.assets.json' doesn't have a target for '.NETStandard,Version=v1.2/win10-x64'如果我在构建目标P2.B后删除了自定义MSBuild目标,那么哪个可以正常工作

任何解决这个问题的指针都会非常有用。

由于

如果有帮助我使用Visual Studio 2017(15.4.1)dotnet sdk(2.0.2)

1 个答案:

答案 0 :(得分:0)

以防其他人遇到类似的诱饵和开关问题,第二个问题(custom target for after build but issue with building with a specified runtime then fails)已解决。该错误似乎是缺少Restore目标构建触发器的原因。

所以要让它发挥作用:

  • 我删除了"开关" lib(P2.B)是单元测试项目的直接项目引用依赖项
  • 添加以下内容作为自定义目标

在净核心单元测试项目.csproj

<Target Name="BaitAndSwitchTarget" AfterTargets="Build">
  <PropertyGroup>
    <LinkedProject>..\P2.B\P2.B.csproj</LinkedProject>
  </PropertyGroup>
  <MSBuild Condition="'$(LinkedProject)' != '' " Projects="$(LinkedProject)" Targets="Restore" />
  <MSBuild Condition="'$(LinkedProject)' != '' " Projects="$(LinkedProject)" Targets="Build" Properties="OutputPath=..\$(MSBuildProjectName)\$(OutputPath)" />
</Target>

然后基本上将切换目标构建为后构建步骤,并将其放置在单元测试项目的输出文件夹中,看起来dotnet build/test/...在CLI中运行良好。