项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦)

知道了 csproj 文件中的一些常用属性,修改文件的时候就不会写很多的垃圾代码。


“项目文件中的已知属性系列”分为两个部分:

什么?你的 csproj 文件太长不想看?说明你用了旧格式的 csproj,阅读我的另一篇文章 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj 将它转为新格式之后,你就会觉得这么简短精炼的 csproj 文件,真不忍将它写杂。

比如通过以下写法,可以将所有的 *.xaml.cs 文件折叠到对应的 *.xaml 文件下,而不需要像旧 csproj 格式那样每个文件都写一份:

<Compile Update="**\*.xaml.cs">
    <DependentUpon>%(Filename)</DependentUpon>
</Compile>

编译上下文

以下属性是基本的输出路径属性,可以在 Microsoft.NET.DefaultOutputPaths.targets 找到。


以下属性控制哪些文件应该被默认包含在编译中,可以在 Microsoft.NET.TargetFrameworkInference.targets 找到。


下面是 Microsoft.NET.Sdk 中的一部分源码,在 Microsoft.NET.Sdk.DefaultItems.props 文件中,可以发现还有更多与控制自动引入文件相关的属性。

<ItemGroup Condition=" '$(EnableDefaultItems)' == 'true' ">
  <Compile Include="**/*$(DefaultLanguageSourceExtension)" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" Condition=" '$(EnableDefaultCompileItems)' == 'true' " />
  <EmbeddedResource Include="**/*.resx" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" Condition=" '$(EnableDefaultEmbeddedResourceItems)' == 'true' " />
</ItemGroup>
<ItemGroup Condition=" '$(EnableDefaultItems)' == 'true' And '$(EnableDefaultNoneItems)' == 'true' ">
  <None Include="**/*" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
  <None Remove="**/*$(DefaultLanguageSourceExtension)" />
  <None Remove="**/*.resx" />
</ItemGroup>

以下属性是 Microsoft.NET.Sdk 中的各种 Target 使用的配置属性,设置这些属性也影响到生成过程。

<Project>
  <PropertyGroup>
    <!-- 此程序集的版本,这是很多其他版本号未设置时的默认值。而此值的默认值是 1.0.0 -->
    <Version>3.1.2-beta</Version>

    <!-- 以下属性是当引用的 dll 出现版本冲突时,用于自动生成绑定重定向的。
         详见:https://www.erikheemskerk.nl/transitive-nuget-dependencies-net-core-got-your-back/ -->

    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
  </PropertyGroup>
</Project>

可以阅读 解读 Microsoft.NET.Sdk 的源码,你能定制各种奇怪而富有创意的编译过程Reading the Source Code of Microsoft.NET.Sdk, Writing the Creative Extension of Compiling 了解更多 Microsoft.NET.Sdk 源码。

文件路径

项路径

写在 csproj 文件中 ItemGroup 组中的每一个元素即“项”。

对以下这一项进行说明的话:

<ItemGroup>  
    <Compile Include="src\Program.cs" />  
</ItemGroup> 

那么,可用的属性有:

全局路径

另外还有一些在新的 SDK 中几乎不会在日常开发中用到的全局属性:

如果希望了解在 csproj 中创建 NuGet 包时可用的属性,请参考我的另一篇博客:项目文件中的已知 NuGet 属性(知道了这些,创建 NuGet 包就可以不需要 nuspec 文件啦) - 吕毅


参考资料

本文会经常更新,请阅读原文: https://walterlv.github.io/post/known-properties-in-csproj.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系