防止VS向csproj添加显式编译标签

Posted

技术标签:

【中文标题】防止VS向csproj添加显式编译标签【英文标题】:Prevent VS from adding explicit compile tags to csproj 【发布时间】:2021-04-09 23:00:34 【问题描述】:

我知道 .NET Core 对 .csproj 文件的更改,以及 GLOB 如何自动检测 *.cs 文件,如 as documented here。但是,问题是我在编译时仍然遇到某个错误。

如上述链接中所述,我不断收到错误消息:

包含重复的编译项。默认情况下,.NET SDK 包括项目目录中的编译项。您可以从项目文件中删除这些项目,或者如果您想在项目文件中明确包含这些项目,则将“EnableDefaultCompileItems”属性设置为“false”。

我的项目在项目目录中完美地拾取了所有 *.cs 文件。但是,每当我** ADD A NEW** 类(右键单击>> 添加新项目)时,也会将以下内容添加到 .csproj 中:

<ItemGroup>
    <Compile Include="Base\Class1.cs" />
</ItemGroup>

我知道简单地删除它可以防止错误发生,因为这个显式编译与 GLOB 的隐式包含冲突。我怎样才能阻止这种情况发生?

编辑

这是我的 .csproj:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <LangVersion>8</LangVersion>
        <NeutralLanguage>en</NeutralLanguage>
        <Authors>Phillip Smith</Authors>
        <Company>Phillip Smith</Company>
        <Description>.Net Standard library to read and write .m64 files for Mupen64</Description>
        <PackageIcon>nugetIcon.png</PackageIcon>
        <PackageTags>mupen, n64, m64</PackageTags>
        <EnableNETAnalyzers>true</EnableNETAnalyzers>
        <PackageProjectUrl>https://github.com/TimeTravelPenguin/MupenSharp</PackageProjectUrl>
        <RepositoryUrl>https://github.com/TimeTravelPenguin/MupenSharp</RepositoryUrl>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
        <Version>1.0.3.5</Version>
        <Copyright>Phillip Smith</Copyright>
        <PackageLicenseExpression></PackageLicenseExpression>
        <ApplicationIcon>icon.ico</ApplicationIcon>
    </PropertyGroup>

    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
        <DocumentationFile>D:\C#_Offline\MupenMovieEditor\MupenSharp\MupenSharp.xml</DocumentationFile>
    </PropertyGroup>

    <ItemGroup>
        <Content Include="icon.ico" />
    </ItemGroup>

    <ItemGroup>
        <PackageReference Include="JetBrains.Annotations" Version="2020.3.0" />
    </ItemGroup>

    <ItemGroup>
        <Reference Include="System.ComponentModel.DataAnnotations">
            <HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.ComponentModel.DataAnnotations.dll</HintPath>
        </Reference>
    </ItemGroup>

    <ItemGroup>
        <None Include="..\..\Images\nugetIcon.png">
            <Pack>True</Pack>
            <PackagePath></PackagePath>
        </None>
    </ItemGroup>

    <ItemGroup>
        <Compile Update="Resources\ExceptionsResource.Designer.cs">
            <DesignTime>True</DesignTime>
            <AutoGen>True</AutoGen>
            <DependentUpon>ExceptionsResource.resx</DependentUpon>
        </Compile>
    </ItemGroup>

    <ItemGroup>
        <EmbeddedResource Update="Resources\ExceptionsResource.resx">
            <Generator>ResXFileCodeGenerator</Generator>
            <LastGenOutput>ExceptionsResource.Designer.cs</LastGenOutput>
        </EmbeddedResource>
    </ItemGroup>
</Project>

编辑 2

视频演示:

https://youtu.be/3ZU-Ue-goaE

【问题讨论】:

请让我们知道您的问题的任何进一步进展,我们愿意进一步帮助您。 【参考方案1】:

new-sdk 项目将自动识别文件类型,然后将其作为项目包含在您的项目中。因此,您不必定义与文件相关的任何项目。

是new-sdk项目的新特​​性。

由于您已经通过csproj文件下的项目定义了您的文件,并且希望在不删除这些项目的情况下使用它们,您应该禁用自动关联功能。

csproj 文件下添加这些以禁用它:

 <PropertyGroup>
         <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
 </PropertyGroup>

除了,还有a similar issue可以查看。

更新 1

其实EnableDefaultCompileItemsfalse只是禁用全局查找功能(禁用隐式关联),避免重复识别项目----使用Net框架项目下的旧功能。

您必须手动使用 csproj 中的项目来包含任何项目。如果你不写任何项目来包含文件,VS 会出错。其特点是改进功能。 new-sdk 项目启用了这种自动功能,以简化开发人员的麻烦。

另外,如果你使用EnableDefaultCompileItemsfalse,一些你之前定义为隐式文件的编译项会因为关闭自动关联功能而丢失,不会留下任何标记在csproj

但是,这些文件仍然存在于您的项目下。在这种情况下,您必须在解决方案资源管理器中单击显示所有文件,然后将它们包含在您的项目中。

================================================ ==

另外,具有全局查找功能的新 sdk 项目无法与 compile include 节点一起使用。这是双重复导入文件。

其实,还是有替代方案的。

您可以使用更新节点。

直接用这个不用EnableDefaultCompileItems:

<ItemGroup>
    <Compile Update="Base\Class1.cs" />
</ItemGroup>

注意update 是 new-sdk 项目的特性,仅适用于已在全局范围内检测到并通过 new-SDK 项目的隐式关联发现的项目。如果文件没有隐式关联,那么update 将永远无法工作。

也就是说,如果你要关联的文件在项目之外(摆脱项目的隐式关联),那么你只能使用include将这些文件从从外部进入内部项目,update 仅适用于后续 MSBuild 操作作为隐式关联文件,这相当于对自动关联文件的补充而不是重新导入,更可能是覆盖操作。

Update 作用于内部项目的文件,而Include 作用于外部 项目的文件。

这与include 节点不同。

我的项目在 项目目录。但是,每当我 ** ADD A NEW* 课程(对 点击>>添加新项目),以下内容也添加到.csproj中:

这意味着您已经将EnableDefaultCompileItems 设置为false。有了这个,你的csproj 就会有这个包含节点。

如果您仍有此问题,请与我们分享您的 csproj 文件,以帮助我们解决您的问题。

【讨论】:

我认为这是不对的。通过这样做,我的解决方案资源管理器中的所有内容都会消失并且不再出现。我的项目不再编译。我相信这是因为默认使用 GLOB 查找所有类,这是正常功能。但是,直到最近才在我不想要的情况下将我提到的代码添加到我的 csproj 中。 我有一个完整和全面的解释给你。请参阅我更新的答案。请检查一下。 抱歉耽搁了;我最近很忙。我的项目中没有这些节点。我已经用我的整个 csproj 编辑了我的问题。请注意,我在一个全新的项目中遇到了同样的问题。 @PerryQian-MSFT 我遇到了与@TimeTravelPenguin 相同的问题。他的视频准确地详细说明了我的问题。这个问题直到 VS 16.8 才出现。它甚至出现在最新的 16.9.0 中。我已经禁用了每个 VS 扩展,同样的问题。我们不想将EnableDefaultCompileItems 设置为false。相反,我们希望 VS 不向我们的 csproj 添加不必要的 Compile 元素。我有exported my VS settings so that may be inspected as well。 @TimeTravelPenguin 我无法再在 VS 16.10.0 RTW 中重现此问题。

以上是关于防止VS向csproj添加显式编译标签的主要内容,如果未能解决你的问题,请参考以下文章

编译器构造:显式解析树

如何防止特定符号被编译器/链接器剥离?

Spring MVC:将模型作为参数传递给控制器​​方法VS显式实例化它

如何在不显式编译的情况下让 Visual Studio 错误检查我的代码(显示曲线)?

隐式 vs 显式 vs Fluent 等待

如何防止 Visual Studio 更改我的 csproj 格式