在Visual Studio中显示文件时从Compile中排除文件

问题描述 投票:0回答:1

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

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

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

我几乎得到了一切工作,除了我似乎无法找到一种方法让Visual Studio(2017社区)在解决方案资源管理器中显示Generated目录及其文件,而不是尝试在设计时将它们一起编译。

我当前的设置不会在解决方案资源管理器中向我显示文件,但会使用它们来构建。以下是我的.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显示文件而不构建它们?我错过了什么?

.net msbuild .net-core visual-studio-2017 csproj
1个回答
1
投票

复制评论。

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

其次,在你的具体情况下,如果我们用<Compile>标签手动替换<None>标签,那么VS可以显示文件是项目中的普通文件,但不是源代码来提供编译器。这样的技巧对于其他人(在你的团队或其他情况下)很难理解为什么你应用它,因为像名称所示的<None>标签用于非源代码文件,例如txt或其他扩展。

第三,如果您确实需要这些文件具有特殊行为,您可以考虑使用自己的标记扩展MSBuild系统(如ANTLR C#通过添加<Antlr4>标记来实现),https://github.com/tunnelvisionlabs/antlr4cs

© www.soinside.com 2019 - 2024. All rights reserved.