内容简介:知道了 csproj 文件中的一些常用属性,修改文件的时候就不会写很多的垃圾代码。“项目文件中的已知属性系列”分为两个部分:
知道了 csproj 文件中的一些常用属性,修改文件的时候就不会写很多的垃圾代码。
“项目文件中的已知属性系列”分为两个部分:
- 本文: 项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - 吕毅
- 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦) - 吕毅
什么?你的 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 找到。
-
$(Configuration)
- 这就是我们传说中决定 Debug 还是 Release 的属性。如果没有指定,默认是 Debug。本身没有什么意义,因为各种其他行为判断了这个属性的值,于是就有了编译差别。
-
$(Platform)
- 默认是
AnyCPU
,还可以是x86
、x64
或者ARM
。
- 默认是
-
$(BaseOutputPath)
- 输出路径的起始位置。如果没有指定,就是
bin\
。修改这个属性可以间接修改OutputPath
。
- 输出路径的起始位置。如果没有指定,就是
-
$(OutputPath)
- 输出路径,默认有两种可能的值。如果
AnyCPU
编译,就是$(BaseOutputPath)$(Configuration)\
;否则就是$(BaseOutputPath)$(PlatformName)\$(Configuration)\
- 输出路径,默认有两种可能的值。如果
-
$(BaseIntermediateOutputPath)
- 临时生成路径的起始位置。如果没有指定,就是
obj\
。修改这个属性可以间接修改IntermediateOutputPath
。
- 临时生成路径的起始位置。如果没有指定,就是
-
$(IntermediateOutputPath)
- 临时生成路径,默认有两种可能的值。如果
AnyCPU
编译,就是$(BaseIntermediateOutputPath)$(Configuration)\
;否则就是$(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\
- 临时生成路径,默认有两种可能的值。如果
额外的,如果你试图在编译期间使用 dll,你可能需要判断运行时环境:
-
$(MSBuildRuntimeType)
- 例如你可以使用
Condition=" '$(MSBuildRuntimeType)' == 'Core'"
来判断当前编译环境是否是 .NET Core。
- 例如你可以使用
关于输出路径的更多说明,可以阅读我的另一篇博客: 如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀)
以下属性控制哪些文件应该被默认包含在编译中,可以在 Microsoft.NET.TargetFrameworkInference.targets 找到。
-
$(EnableDefaultItems)
- 默认为
true
,如果指定为false
,那么就不自动将 .cs 和 .resx 文件引入。
- 默认为
-
$(DefaultItemExcludes)
- 默认为输出路径(
OutputPath
)和临时生成路径(IntermediateOutputPath
)下的所有文件。
- 默认为输出路径(
-
$(AppendTargetFrameworkToOutputPath)
- 默认我们生成路径会包含
net47
或者netcoreapp2.1
这样的一层文件夹,如果指定为false
,这一层文件夹就不会生成了。
- 默认我们生成路径会包含
下面是 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>
那么,可用的属性有:
-
%(FullPath)
- 文件的完全路径,例如:
C:\Users\walterlv\GitHub\Demo\Walterlv.DemoProject\src\Program.cs
- 文件的完全路径,例如:
-
%(RootDir)
- 文件所在的根目录,例如:
C:\
- 文件所在的根目录,例如:
-
%(Filename)
- 文件名(不含扩展名),例如:
Program
- 文件名(不含扩展名),例如:
-
%(Extension)
- 文件扩展名,例如:
.cs
- 文件扩展名,例如:
-
%(RelativeDir)
- 文件所在的文件夹,例如:
src\
- 文件所在的文件夹,例如:
-
%(Directory)
- 除了根目录之外的目录,例如:
walterlv\GitHub\Demo\Walterlv.DemoProject\src\
- 除了根目录之外的目录,例如:
-
%(RecursiveDir)
- 如果项是用通配符写的,那么此值表示匹配到某一项时的目录,例如:
walterlv\GitHub\Demo\Walterlv.DemoProject\src\
- 如果项是用通配符写的,那么此值表示匹配到某一项时的目录,例如:
-
%(Identity)
- 项的标识符,也就是 Include 里写的东西,例如:
src\Program.cs
- 项的标识符,也就是 Include 里写的东西,例如:
-
%(ModifiedTime)
- 文件的修改时间,例如:
2018-04-12 21:00:43.7851385
- 文件的修改时间,例如:
-
%(CreatedTime)
- 文件的创建时间,例如:
2018-04-12 21:01:50.1417635
- 文件的创建时间,例如:
-
%(AccessedTime)
- 文件最近被访问的时间,例如:
2018-04-12 21:02:15.4132476
- 文件最近被访问的时间,例如:
全局路径
- 项目文件
-
$(MSBuildProjectFullPath)
- 项目文件的绝对路径,例如:
C:\Users\walterlv\GitHub\Demo\Walterlv.DemoProject.csproj
- 项目文件的绝对路径,例如:
-
$(MSBuildProjectDirectory)
- 项目所在的文件夹,例如:
C:\Users\walterlv\GitHub\Demo
- 项目所在的文件夹,例如:
-
$(MSBuildProjectFile)
- 项目文件的完整名称,例如:
Walterlv.DemoProject.csproj
- 项目文件的完整名称,例如:
-
$(MSBuildProjectName)
- 项目文件的名称,不含扩展名,例如
Walterlv.DemoProject
- 项目文件的名称,不含扩展名,例如
-
$(MSBuildProjectExtension)
- 项目文件的扩展名,例如:
.csproj
- 项目文件的扩展名,例如:
-
$(MSBuildProjectDirectoryNoRoot)
- 项目文件去除驱动器的路径,包含反斜杠
-
- 部件(例如 .props 文件或 .targets 文件,当然也包含 .csproj 文件)
-
$(MSBuildThisFileFullPath)
- 用这个属性的文件所在的绝对路径,例如
C:\Users\walterlv\.nuget\packages\walterlv.nuget.demo\2.13.0\build\netstandard2.0\Walterlv.NuGet.Demo.targets
- 用这个属性的文件所在的绝对路径,例如
-
$(MSBuildThisFileDirectory)
- 此文件所在的文件夹,例如:
C:\Users\walterlv\.nuget\packages\walterlv.nuget.demo\2.13.0\build\netstandard2.0\
- 此文件所在的文件夹,例如:
-
$(MSBuildThisFile)
- 此文件的完整名称,例如
Walterlv.NuGet.Demo.targets
- 此文件的完整名称,例如
-
$(MSBuildThisFileName)
- 此文件的名称,不含扩展名,例如
Walterlv.NuGet.Demo
- 此文件的名称,不含扩展名,例如
-
$(MSBuildThisFileExtension)
- 此文件的扩展名,例如
.targets
- 此文件的扩展名,例如
-
$(MSBuildThisFileDirectoryNoRoot)
- 此文件去除驱动器的路径,包含反斜杠
-
- 环境
-
$(MSBuildStartupDirectory)
- 启动 MSBuild 时的路径,类似于工作目录(输入 msbuild 命令时所在的那个文件夹)
-
- 工具
-
$(MSBuildToolsPath)
- MSBuild 工具所在的路径
-
$(MSBuildToolsVersion)
- 此次编译锁使用的 工具 的版本
-
另外还有一些在新的 SDK 中几乎不会在日常开发中用到的全局属性:
-
$(MSBuildBinPath)
: MSBuild 程序所在的路径 -
$(MSBuildExtensionsPath)
: 自定义 targets 所在的路径 -
$(MSBuildExtensionsPath32)
: 自定义 targets 所在的路径 -
$(MSBuildExtensionsPath64)
: 自定义 targets 所在的路径 -
$(MSBuildLastTaskResult)
: 如果前一个 Task 结束后成功,则为 true;否则为 false -
$(MSBuildNodeCount)
: 编译时并发的进程数,与命令行中的/maxcpucount
时一个意思 -
$(MSBuildProgramFiles32)
: 通常是C:\Program Files (x86)
-
$(MSBuildProjectDefaultTargets)
: 在Project
根节点上设置的默认 Targets,例如:<Project DefaultTargets="A;B;C" >
-
$(MSBuildBinPath)
: MSBuild 程序所在的路径 -
$(MSBuildBinPath)
: MSBuild 程序所在的路径 -
$(MSBuildBinPath)
: MSBuild 程序所在的路径 -
$(MSBuildBinPath)
: MSBuild 程序所在的路径
如果希望了解在 csproj 中创建 NuGet 包时可用的属性,请参考我的另一篇博客: 项目文件中的已知 NuGet 属性(知道了这些,创建 NuGet 包就可以不需要 nuspec 文件啦) - 吕毅 。
参考资料
本文会经常更新,请阅读原文: https://walterlv.com/post/known-properties-in-csproj.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接:https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com) 。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 13 - 已知小问题修正
- 13 - 已知小问题修正
- 利用“已知明文攻击”破解加密的压缩文件
- 喧喧发布 2.5.2 版本,主要修复已知问题
- MDword 1.0.2 正式发布,已知 BUG 修改
- 喧喧 2.4.1 发布,解决了已知的关键问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。