msbuild不会将引用的本机项目的输出复制到c#project out dir

时间:2017-12-24 12:17:41

标签: build msbuild visual-studio-2017 devenv

我现在很长时间都在挣扎。

设置:

  • c#project
  • c ++ project
  • c#project包含对c ++项目的引用,其中包含以下行:

    <ProjectReference Include="projectB.vcxproj">
        <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
        <OutputItemType>Content</OutputItemType>
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </ProjectReference>
    

这与视觉工作室有关。 从命令行使用devenv时可以使用此方法。 从命令行使用msbuild时 - c ++项目的输出文件不会复制到c#项目的输出目录中。

我无法使用msbuild解决这个问题。阅读了很多关于它,没有任何效果。尝试使用diag详细程度进行调试 - 但是msbuild和visual-studio的日志非常不同...... 我不能转向使用devenv,因为构建机器没有有效的visual-studio。

在具有诊断详细程度的msbuild日志中,我看到: Target "GetCopyToOutputDirectoryItems" skipped. Previously built successfully. 这是visual-studio日志中的位置 - 它看起来不同 - 实际上是将引用的本机文件复制到c#输出目录。 也许与构建顺序有关的东西?..

在msbuild日志中 - 我也看到: Target "_CopyOutOfDateSourceItemsToOutputDirectoryAlways" skipped, due to false condition; ( '@(_SourceItemsToCopyToOutputDirectoryAlways)' != '' ) was evaluated as ( '' != '' ). 在visual-studio构建日志中,我看到此目标已执行(它在GetCopyToOutputDirectoryItems目标之后出现)

1 个答案:

答案 0 :(得分:1)

更新3: 以前的解决方案似乎会导致不必要的副作用,例如在运行多线程构建时破坏构建。

当前的解决方案似乎有效,是添加: <Targets>Build;BuiltProjectOutputGroup</Targets>ProjectReference部分。

更新2:

更改:

Targets="%(_MSBuildProjectReferenceExistent.Targets)"

Targets="%(_MSBuildProjectReferenceExistent.Targets);GetTargetPath"

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets中的

,在注释Build referenced projects when building from the command line.之前的MSBuild任务中 - 完成了这一操作。

但是,我对此解决方案没有信心,因为我不了解整个构建过程。这只是猜测。

更新1:

使用/p:DesignTimeBuild=true会影响依赖关系构建顺序。无法工作。继续调查......

可能的解决方案1:

将大量留言放入C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets

我终于得到了以下内容: QUIRKING FOR DEV10

我仍然不确定这是什么,我看到开发者计划删除这个怪癖(见https://github.com/Microsoft/msbuild/issues/1890)。

突然DesignTimeBuild引起了我的注意:

<Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths" Condition="'%(_MSBuildProjectReferenceExistent.ReferenceOutputAssembly)'=='true' or '$(DesignTimeBuild)' == 'true'"/>

我知道视觉工作室里面的这项工作。谷歌搜索让我到https://github.com/Microsoft/msbuild/wiki/MSBuild-Tips-&-Tricks。 从那里开始,将/p:DesignTimeBuild=true添加到msbuild命令行的路径很短。

这使它成功了。引用的程序集已复制过来。

我不认为这应该是解决方案,但它有效,并且似乎没有打破任何其他(还)。

欢迎任何其他建议。