【问题标题】:DotNet Core .csproj code files as child itemsDotNet Core .csproj 代码文件作为子项
【发布时间】:2023-07-12 00:02:01
【问题描述】:

我正在将旧的 .NET Framework csproj 迁移到 dotnet 核心。与此等效的 dotnet 核心是什么:

<Compile Include="ServiceHost.Designer.cs">
  <DependentUpon>ServiceHost.cs</DependentUpon>
</Compile>

我试过了:

<ItemGroup>
    <Compile Include="ServiceHost.Designer.cs">
        <DependentUpon>ServiceHost.cs</DependentUpon>
    </Compile>
</ItemGroup>

但是我收到了这个错误:

包含重复的“编译”项目。 .NET SDK 包括 默认情况下,从您的项目目录中“编译”项目。你可以 从项目文件中删除这些项目,或设置 如果您愿意,将“EnableDefaultCompileItems”属性设置为“假” 明确地将它们包含在您的项目文件中。了解更多信息, 见https://aka.ms/sdkimplicititems。重复的项目是: 'ProjectInstaller.Designer.cs'; 'ServiceHost.Designer.cs' TestWindowsService C:\Program Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.DefaultItems.targets

【问题讨论】:

标签: c# msbuild .net-core csproj


【解决方案1】:

由于默认包含项目,如果您只想修改需要此更新的项目而不是单独列出每个cs文件,则需要使用Update而不是Include

<ItemGroup>
    <Compile Update="ServiceHost.Designer.cs">
        <DependentUpon>ServiceHost.cs</DependentUpon>
    </Compile>
</ItemGroup>

【讨论】:

    【解决方案2】:

    新格式 SDK 项目有几个通配模式默认设置为“True”。其中之一是在项目目录及其子目录中包含所有 *.cs 文件。您收到的错误是由 *.cs 文件的双重包含引起的,并且有一种简单的方法可以防止它在错误消息中指示。您应该在项目中包含以下属性:

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

    使用该设置,您必须使用以下命令明确包含项目中的所有文件:

    <ItemGroup>
        <Compile Include="ServiceHost.Designer.cs">
            <DependentUpon>ServiceHost.cs</DependentUpon>
        </Compile>
        <Compile Include="MyOtherFile.cs"/>
        .......
    </ItemGroup>
    

    如果您决定不使用 EnableDefaultCompileItems 设置将自动包含所有 *.cs 文件,但是,它们的分组可能会令人困惑,因为它可能会在没有任何子分组的情况下被展平。在这种情况下,您不应在.csproj 中明确包含任何*.cs 文件。项目使用的 globbing 模式会自动为您包含项目中的文件。

    【讨论】:

    • 我否决了这个答案,因为 Martin 的答案是正确的选择。尤其是对于有很多文件的大型项目,如果您想要“嵌套”的只是几个文件,您不希望单独明确地包含每个文件。