Roslyn/MSBuild 在编译期间处理路径中的斜杠与反斜杠(\)

栏目: Html · 发布时间: 5年前

内容简介:本文介绍如何在项目文件 csproj,或者 MSBuild 的其他文件(props、targets)中处理路径中的斜杠与反斜杠。我们都知道文件路径的层级之间使用斜杠(对于一个文件夹的路径,末尾无论是否有反斜杠都不会影响找到这个路径对应的文件夹,但是有时我们又因为一些特殊的用途需要知道末尾的反斜杠的情况。

本文介绍如何在项目文件 csproj,或者 MSBuild 的其他文件(props、targets)中处理路径中的斜杠与反斜杠。

路径中的斜杠与反斜杠

我们都知道文件路径的层级之间使用斜杠( / )或者反斜杠( \ )来分隔,具体使用哪一个取决于操作系统。本文不打算对具体使用哪一种特别说明,不过示例都是使用 Windows 操作系统中的反斜杠( \ )。

对于一个文件夹的路径,末尾无论是否有反斜杠都不会影响找到这个路径对应的文件夹,但是有时我们又因为一些特殊的用途需要知道末尾的反斜杠的情况。

在 MSBuild 中,通常有一个在文件夹路径末尾添加反斜杠 \ 的惯例,这样可以直接使用属性拼接来形成新的路径而不用担心路径中的不同层级的文件夹会连接在一起。

例如属性 WalterlvPath1 的值为 bin ,属性 WalterlvPath2 的值为 Debug 。为了确保两个可以直接使用 $(WalterlvPath1)$(WalterlvPath2) 来拼接,我们需要在这两个属性的末尾都加上反斜杠 \ 。不过由于需要照顾到各式各样的开发者,包括大多数的那些从来不看文档的开发者,我们需要进行本文所述的处理。

判断路径末尾是否有斜杠或反斜杠

如果路径末尾没有反斜杠,那么我们现在就添加一个反斜杠。

<WalterlvPath Condition="!HasTrailingSlash('$(WalterlvPath)')">$(WalterlvPath)\</WalterlvPath>

这样,如果 WalterlvPath 的值为 bin ,则会在这一个属性重新计算值的时候变成 bin\ ;如果已经是 bin\ ,则不会重新计算值,于是保持不变。

确保路径末尾有斜杠或反斜杠

另外,也有方法可以不用做判断,直接给末尾根据情况加上反斜杠。

通过调用 MSBuild.EnsureTrailingSlash 可以确保路径的末尾已经有一个斜杠或者反斜杠。

例如,我们有一个 WalterlvPath 属性,值可能是 bin\Debug 也有可能是 bin\Debug\ ,那么可以统一将其处理成 bin\Debug\

<WalterlvPath>$([MSBuild]::EnsureTrailingSlash('$(WalterlvPath)'))</WalterlvPath>

确保路径末尾没有斜杠或反斜杠

正常情况下,我们都是需要 MSBuild 中文件夹路径的末尾有斜杠或者反斜杠。不过,当我们需要将这个路径作为命令行参数的一部分传给一个可执行程序的时候,就没那么容易了。

因为为了确保路径中间的空格不会被命令行参数解析给分离,我们需要在路径的周围加上引号。具体来说,是使用 &quot; 转义字符来添加引号:

<Target Name="WalterlvDemoTarget" BeforeTargets="BeforeBuild">
    <Exec Command=""$(WalterlvDemoTool)" --option "$(WalterlvPath)"" />
</Target>

以上的 Target 是我在另一篇博客中的简化版本: 如何创建一个基于命令行 工具 的跨平台的 NuGet 工具包 - walterlv 。

但是这样,如果 WalterlvPath 中存在反斜杠,那么这个命令行将变成这样:

> "walterlv.tool.exe" --option "bin\"

后面的 \" 将使得引号成为路径中的一部分,而这样的路径是不合法的路径!

我们可以确保路径的末尾添加一个空格来避免将引号也解析成命令行的一部分:

<Target Name="WalterlvDemoTarget" BeforeTargets="BeforeBuild">
    <Exec Command=""$(WalterlvDemoTool)" --option "$([MSBuild]::EnsureTrailingSlash('$(BasePathInInstaller)')) "" />
</Target>

不过也可以通过 SubString 来对末尾的斜杠或反斜杠进行裁剪。

<WalterlvPath Condition="HasTrailingSlash('$(WalterlvPath)')">$(WalterlvPath.Substring(0, $([MSBuild]::Add($(WalterlvPath.Length), -1))))</WalterlvPath>

解释一下这里 $(WalterlvPath.Substring(0, $([MSBuild]::Add($(WalterlvPath.Length), -1)))) 所做的事情:

  1. $(WalterlvPath.Length) 计算出 WalterlvPath 属性的长度;
  2. $([MSBuild]::Add(length, -1)) 调用加法,将前面计算所得的长度 -1,用于提取无斜杠或反斜杠的路径长度。
  3. $(WalterlvPath.Substring(0, length-1) 将路径字符串取出子串。

这里的解释里面, length 只是表意,并不是为了编译通过。要编译的代码还是上面代码块中的完整代码。


以上所述就是小编给大家介绍的《Roslyn/MSBuild 在编译期间处理路径中的斜杠与反斜杠(\)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

笨办法学Python 3

笨办法学Python 3

[美]泽德 A. 肖 / 王巍巍 / 人民邮电出版社 / 2018-6-1 / CNY 59.00

本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用。这本书以习题的方式引导读者一步一步学习编程,从简单的打印一直讲到完整项目的实现,让初学者从基础的编程技术入手,最终体验到软件开发的基本过程。本书是基于Python 3.6版本编写的。 本书结构非常简单,除“准备工作”之外,还包括52个习题,其中26个覆盖了输入/输出、变量和函数3个主题,另外26个......一起来看看 《笨办法学Python 3》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码