1

我的一个 msbuild 项目文件中有一个 import 语句:

<Import Project="$(ProjectDir)..\CommonProjectProperties\OurCommon.targets" Condition="Exists('$(ProjectDir)..\CommonProjectProperties\OurCommon.targets" />

导入的 msbuild 项目具有以下属性组:

<PropertyGroup Condition="'$(Configuration)' == 'Debug' And '$(SolutionName)' == 'Ourwork' And Exists('$(ProjectDir)..\..\FXCopSettings\OurGlobal.ruleset')">
    <CodeAnalysisRuleSet>$(ProjectDir)..\..\FXCopSettings\OurGlobal.ruleset</CodeAnalysisRuleSet>
    <RunCodeAnalysis>true</RunCodeAnalysis>
    <CodeAnalysisIgnoreGeneratedCode>True</CodeAnalysisIgnoreGeneratedCode>
    <DefineConstants>$(DefineConstants);CODE_ANALYSIS</DefineConstants>
</PropertyGroup>

以及以下项目组:

<When Condition="Exists('$(ProjectDir)\..\..\Solutions\FXCopSettings\GlobalSuppressions.cs') And Exists('$(ProjectDir)$(ProjectName).csproj')">
        <ItemGroup>
            <Compile Include="$(ProjectDir)\..\..\Solutions\FXCopSettings\GlobalSuppressions.cs" />
        </ItemGroup>
    </When>

基本上我要做的是在我的所有项目文件中都有上述导入语句,然后通过调整导入的项目文件来操纵 FXCop 是否运行。

问题是,从命令行,所有这些都可以正常工作(除了常量 CODE_ANALYSIS,我必须使用 msbuild /t:build proj.sln /p:DefineConstants="CODE_ANALYSIS=true" 之类的东西来设置它。没关系。

从 VS 2010 IDE 来看,它只是......地狱!它“看起来”像 VS 尊重导入的 msbuild 项目文件中的所有内容......除了
1)包含的文件是灰色的,这意味着只有在“显示所有文件”时才会在 IDE 中显示。这意味着它没有编译。我可以将完全相同的 ItemGroup 复制到父 msbuild 项目文件中,并且该文件在解决方案资源管理器中显示为非灰色,这意味着它已被编译。
2) 抑制文件用于告诉 FXCop 在进行代码分析时忽略哪些对象。当我将抑制文件正确编译为项目的一部分时,FXCop 似乎忽略了它。阅读此内容,显然需要打开 CODE_ANALYSIS 常量。我以为我是从导入的项目文件中做的,但没有得到尊重。即使 VS IDE 中的项目属性窗口显示它是一个已定义的常量。同样,当我将 DefinedConstansts 声明移动到父项目文件之一时,IDE 会尊重该常量。

所以......我不确定我是否需要将它分成两个帖子,但这是我的问题:
1)我如何让 IDE 尊重和编译导入的项目文件中列出的文件?
2)如何让 IDE 在导入的项目文件中尊重 DefineConstants

4

0 回答 0