充分利用 MSBuild 自带的方法,可以在编译期间完成大多数常见的属性转换,而不再需要自己专门写库来完成。
本文介绍如何使用 MSBuild 自带的方法,并列举 MSBuild 中各种自带的方法。
如何在编译期间使用 MSBuild 自带的方法
当然,在修改编译期间的代码的时候,你可能需要提前了解项目文件相关的知识:
以下是使用 MSBuild 自带方法的最简单的一个例子,执行 5-1
的数学运算。
1
<Walterlv>$([MSBuild]::Subtract(5, 1))</Walterlv>
更复杂的,可能是 MSBuild 方法调用的嵌套了:
1
<WalterlvPath Condition="HasTrailingSlash('$(WalterlvPath)')">$(WalterlvPath.Substring(0, $([MSBuild]::Add($(WalterlvPath.Length), -1))))</WalterlvPath>
以上两段示例分别来自我的另外两篇博客,如果不明白,可以参考这两篇博客的内容:
MSBuild 自带的方法
数学运算
MSBuild 中数学运算的部分可以参考我的另一篇博客:
EnsureTrailingSlash
确保路径结尾有斜杠。
可参考我的另一篇博客:
GetDirectoryNameOfFileAbove & GetPathOfFileAbove
这两个是非常有用却又非常容易被忽视的 API,非常有必要介绍一下。
可以阅读我的另一篇博客了解其用途和用法:
MakeRelative
计算两个路径之间的相对路径表示。
1
2
3
4
5
6
<PropertyGroup>
<Path1>C:\Walterlv\</Path1>
<Path2>C:\Walterlv\Demo\</Path2>
<WalterlvPath1>$([MSBuild]::MakeRelative($(Path1), $(Path2)))</WalterlvPath1>
<WalterlvPath2>$([MSBuild]::MakeRelative($(Path2), $(Path1)))</WalterlvPath2>
</PropertyGroup>
WalterlvPath1
的值会计算为 Demo\
,而 WalterlvPath2
的值会计算为 ..\
。
ValueOrDefault
如果赋值了,就使用所赋的值;否则使用参数指定的值:
1
2
3
4
<PropertyGroup>
<WalterlvValue1>$([MSBuild]::ValueOrDefault('$(FooBar)', 'walterlv'))</WalterlvValue1>
<WalterlvValue2>$([MSBuild]::ValueOrDefault('$(WalterlvValue1)', 'lindexi'))</WalterlvValue2>
</PropertyGroup>
第一行,因为我们没有定义任何一个名为 FooBar
的属性,所以 WalterlvValue1
属性会计算得到 walterlv
值。第二行,因为 WalterlvValue1
已经得到了一个值,所以 WalterlvValue2
也会得到 WalterlvValue1
的值,也就是 walterlv
,不会得到 lindexi
。
其他
MSBuild 剩下的一些方法使用场景非常有限(不懂就别瞎装懂了),这里做一些简单的介绍。
$([MSBuild]::DoesTaskHostExist(string theRuntime, string theArchitecture))
GetRegistryValue
GetRegistryValueFromView
参考资料
本文会经常更新,请阅读原文: https://blog.walterlv.com/post/msbuild-property-functions.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected]) 。