在Visual Studio中显示文件时将其从编译中排除

时间:2018-09-08 00:31:57

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

我有一个生成文件的文件夹,该文件夹反映了我项目的文件。

示例:如果项目在Framework/HaTool.cs上有一个文件,那么在Generated/Framework/HaTool.cs上也有一个文件。

我正在尝试使用Generated文件进行构建,并使用原始文件进行调试和开发。 (我正在使用#line指令)

除了让我似乎无法找到一种方法来使Visual Studio(2017社区)都显示Generated目录及其在解决方案资源管理器中的文件和不是< / strong>尝试在设计时将它们一起编译。

我当前的设置不会在解决方案资源管理器中向我显示文件,但会使用它们进行构建。这是我的.csproj文件的相关部分:

  <Project ToolsVersion="15.0">

    <PropertyGroup Condition="'$(GeneratedSourcePath)'==''">
      <GeneratedSourcePath>Generated</GeneratedSourcePath>
    </PropertyGroup>

    <ItemGroup>
      <Compile Remove="$(GeneratedSourcePath)\**" />
    </ItemGroup>

    <Target Name="UseGeneratedTarget" BeforeTargets="BeforeBuild" KeepDuplicateOutputs="false">
      <ItemGroup>
        <Compile 
          Condition="Exists('$(GeneratedSourcePath)\%(Compile.Identity)')" 
          Include="$(GeneratedSourcePath)\%(Compile.Identity)" />
        <Compile 
          Condition="Exists('$(GeneratedSourcePath)\%(Compile.Identity)')" 
          Remove="%(Compile.Identity)" />
      </ItemGroup>
    </Target>

    <Target Name="CleanupTarget" AfterTargets="AfterBuild">
      <ItemGroup>
        <Compile>
        <NonGeneratedFilename>$([System.String]::Copy('%(Compile.Identity)').Replace('$(GeneratedSourcePath)\', ''))</NonGeneratedFilename>
        </Compile>
      </ItemGroup>
      <ItemGroup>
        <Compile Include="@(Compile->'%(NonGeneratedFilename)')"/>
      </ItemGroup>
    </Target>

  </Project>

有没有一种方法可以让VS在不构建文件的情况下显示它们?我想念什么?

1 个答案:

答案 0 :(得分:1)

从评论中复制。

首先,如果可能的话,避免在MSBuild脚本上进行自定义非常重要,因为Visual Studio或任何其他IDE可能无法很好地处理自定义。这是可以理解的,因为定制几乎没有限制,但是IDE代码库必须遵循一些规则。

第二,在您的特定情况下,如果我们将<Compile>标记手动替换为<None>标记,则VS可以显示文件是您项目中的普通文件,而不是源代码来馈送编译器。对于其他人(在您的团队中或在其他情况下),这种技巧可能很难理解为什么要应用它,因为名称中的<None>标签是针对非源代码文件(例如txt或其他扩展名)的。

第三,如果您确实需要此类文件具有特殊的行为,则可以考虑使用自己的标签扩展MSBuild系统(就像ANTLR C#通过添加<Antlr4>标签一样进行扩展),https://github.com/tunnelvisionlabs/antlr4cs