Visual Studio忽略MSBuild文件(csproj)的自定义设置

9

注意:Visual Studio 2010 SP1 / MSBuild 4.0

我被这个bug搞疯了,我不明白为什么Visual Studio会表现出这种行为。我正在为我的解决方案中的特定项目编写自定义.targets文件。我已经编辑了.csproj文件:

<Include Project="..\MyTargets.targets" />

在文件底部的Microsoft.CSharp.targets之后。这个目标文件的想法是通过修改_____DependsOn属性来注入要执行的操作,就像PostSharp集成自身一样。
在我苦思冥想为什么我的目标不会运行后,我决定在命令行中使用MSBuild运行它,并查看漂亮格式的彩色输出。
在命令行中,我的目标会运行。从Visual Studio(即使使用clean/rebuild),我的目标也不会运行
我已经将BuildDependsOn挂钩到我的目标上,像这样运行我的目标:
<PropertyGroup>
  <BuildDependsOn>
    MyTargetGoesHere;
    $(BuildDependsOn)
  </BuildDependsOn>
</PropertyGroup>

我的第一反应是我选错了文件。我核实了文件,它是正确的。然后我检查它是否过期。让 Visual Studio 做一些更改,保存,运行。Visual Studio 的新更改生效了,但仍未运行我的目标。

所以我变得绝望了。我在我的目标文件中放置了 显眼的语法错误。MSBuild 爆炸了,但 Visual Studio 成功地编译了项目。

  • 我做错了什么?
  • Visual Studio 不使用 MSBuild 文件吗?
  • 它调用了 Microsoft.Common.targets 中的某个超级秘密目标而不是 "Build" 吗?
  • 为什么 msbuild 表现方式不同于 studio,我以为它们是设计成一起工作的...

3
你有没有在修改 .targets 文件后关闭并重新打开你的解决方案文件? - Brian Kretzler
有趣,Visual Studio是否缓存msbuild文件或其他东西?我没有关闭解决方案,但我重新加载了许多次项目。 - Aren
1
Visual Studio会缓存项目导入的任何msbuild文件。对项目本身的更改将导致项目重新加载,但不会重新加载导入的文件,这就是为什么需要重新加载解决方案的原因。 - Brian Kretzler
1个回答

12
为了总结上面的评论,导入的项目文件的更改不会触发重新加载,导入项目的更改也不会导致导入重新加载。需要重新加载解决方案文件以捕获导入中所做的更改。

我感到非常愚蠢,因为没有想到重新加载解决方案,我以为重新加载项目就足够了。很高兴有澄清,VS会缓存。谢谢。 - Aren
类似的问题,重新加载解决方案对我也没有用。在我的“.psproj”文件(PowerShell项目)中,在构建目标中有一个刺耳的<Error Text="Blah" />,msbuild失败了,但是从Visual Studio 2013构建成功了,却没有任何输出... - BrainSlugs83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接