首页 > 解决方案 > Visual Studio 设计/评估/项目加载 MSBuild 条件

问题描述

BuildingInsideVisualStudio MSBuild 属性允许根据Visual Studio 中是否发生特定构建来编写条件:

<MyProp Condition=" '$(BuildingInsideVisualStudio)' == 'true' ">Foo</MyProp>

但是,在评估/设计/项目加载期间未设置该属性,因此例如在 ccproj 中,这样的东西不起作用:

<Foo Condition=" '$(BuildingInsideVisualStudio)' == 'true' ">2.9</Foo>
<ProductVersion>$(Foo)</ProductVersion>

是否有BuildingInsideVisualStudio等效的 VS 评估/设计/项目负载?

编辑 复制步骤:

  1. 在 Visual Studio 2017 中,创建一个新Azure Cloud Service项目。
  2. 关闭 VS 中的解决方案并ccproj在文本编辑器中打开,然后将行<ProductVersion>2.9</ProductVersion>(您可能有不同的版本)替换为:

.

<Foo Condition=" '$(BuildingInsideVisualStudio)' == 'true' ">2.9</Foo>
<Foo Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">9.9</Foo>
<ProductVersion>$(Foo)</ProductVersion>
  1. 在 Visual Studio 中打开解决方案,您将收到警告:

此项目与较新版本的 Microsoft Azure 工具相关联。您必须下载工具并重新加载项目才能继续。

换句话说,在项目加载期间,BuildingInsideVisualStudio已评估为 false,因此不支持的 9.9ProductVersion已解决。

标签: visual-studiomsbuild

解决方案


因此,例如在 ccproj 中,这样的事情是行不通的:

实际上它对我来说效果很好,所以我想如果房产的位置会产生这种差异。我在每个可能的地方都尝试过,但无法重现相同的问题。

根据您的not set during evaluation/design/project-load,您是否使用该属性作为项目节点的条件,如下所示:

<Project... Condition="$(BuildingInsideVisualStudio) " ...>
      ...
</Project>

仅在这种情况下,该属性无法工作,因为 Project 节点本身不支持Condition. 我们必须像使用它inside <Project>一样使用它到 PropertyGroup,ItemGroup,Property...

是否有 VS 评估/设计/项目加载 BuildingInsideVisualStudio 等价物?

不清楚您的意思,但如果您的意思是使用项目内容之外的属性,如下所示,恐怕答案是否定的。

<Project Condition="'$(BuildingInsideVisualStudio)' == 'true'">
   content of project if builds in vs
</Project>

<Project Condition="'$(BuildingInsideVisualStudio)' == 'false'">
   content of project if builds not in vs
</Project>

如果我有任何误解,请随时告诉我,预计会有更多详细信息来重现该问题:)

编辑:

通过 Ohad 的详细信息,我重现了这个问题。目前,该属性仅在构建过程开始时有效,只有在 VS 中构建BuildingInsideVisualStudio时才会设置为 True ,但在 VS 中重新加载或打开时不会设置为 True,这会导致问题。

但是我不知道是否存在类似的项目负载属性:LoadingInsideVisualStudio。答案可能是否定的。


推荐阅读