【问题标题】:MSBuild ZipDirectory Task uses backslash on some computer but forward slash on anotherMSBuild ZipDirectory 任务在某些计算机上使用反斜杠,但在另一台计算机上使用正斜杠
【发布时间】:2020-12-30 11:32:42
【问题描述】:

我将以下内容作为“部署”项目的一部分,我使用 msbuild.exe (VS2017) 从批处理文件手动运行该项目。

<Target Name="ZipRelease"
    DependsOnTargets="getversion;gettime">
<MakeDir Directories="$(ReleaseDir)" Condition="!Exists('$(ReleaseDir)')" />
<ZipDirectory Condition="Exists('$(BuildDir)')"
    SourceDirectory="$(BuildDir)"
    DestinationFile="$(ReleaseDir)\$(MODNAME)-$(DLLVersion)_$(CurrentDate).zip" />
</Target>

在一台 PC 上,我使用 VS2017 的社区版。我可能在那台机器上也安装了 VS2019(没办法检查几个星期)。至关重要的是,批处理文件强制使用 VS2017。在另一台电脑上我有 VS2017 Professional。

在使用 Community Edition 的 PC 上,此任务会创建正确的 zip 文件,该文件使用正斜杠作为路径分隔符。在使用 VS2017Pro 的 PC 上,该任务创建带有反斜杠的 zip 文件,这显然违反规范并导致很多问题(生成的 ZIP 部署在 Linux 和 Windows 上)。

This thread 表示 DotNet 4.6.1 或更高版本修复了创建 ZIP 文件时使用的路径分隔符。我将 ToolsVersion="15.8" 指定为项目配置的一部分(ZipDirectory 任务的最低版本),但如何强制 MSBuild 任务使用 DotNet 版本?

我已尝试从 PC 上卸载所有早期版本的 Dotnet SDK/目标框架,但无济于事。

还记录了一个覆盖 (Switch.System.IO.Compression.ZipFile.UseBackslash),但这仅适用于应用程序,而不适用于 MSBuild 任务。

与 MS 的东西一样,到处都是不一致的地方,我的谷歌技能不足以找到答案,非常感谢任何人能够指出我正确的方向。

【问题讨论】:

  • 好的,进一步挖掘显示我的任务正在使用最新的 Windows DotNet 运行时(无法卸载)运行,而不是 Visual Studio 运行时。即便如此,它使用的是 DotNet 4.8。所以我不知道为什么在这台电脑上 ZIP 是用反斜杠写的。我猜它必须等到我可以将环境与我的另一台 PC 进行比较。我什至安装了 DotNet5,但没有更新 Windows DotNet。
  • FWIW,我想出了如何从我的项目文件中打印运行时框架信息。 Environment.Version.ToString() : 4.0.30319.42000 -> DotNet 4.6 或更高版本 (docs.microsoft.com/en-us/dotnet/api/…) 尝试手动安装 DotNet 4.8 -> 失败(已安装更高版本)4.6.1 -> 已更改什么都没有(好吧,我们显然已经在使用 4.8...) 确认:: System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription : 4.8.4300.0

标签: msbuild visual-studio-2017


【解决方案1】:

安装 VS2019 修复它。

我的脚本似乎自动配置为使用最新版本的 Visual Studio,而不是像我最初所说的那样强制自己使用 VS2017。

尽管构建脚本为其运行时框架报告的所有 DotNet 版本号仍然相同,但在 VS2017 和 VS2019 环境中运行时有些东西明显不同。

如果能弄清楚究竟是什么以及是否可以强制 VS2017 安装也使用它,那将是非常非常好的..

【讨论】:

    【解决方案2】:

    尝试使用

    <ZipDirectory Condition="Exists('$(BuildDir)')"
        SourceDirectory="$(BuildDir)"
        DestinationFile="$([System.String]::Copy($(ReleaseDir)\$(MODNAME)-$(DLLVersion)_$(CurrentDate).zip).Replace('\', '/'))" />
    

    实际上,我所有的代理都使用反斜杠作为路径。而且 windows 总是使用反斜杠作为路径,所以我想知道您是否对 windows 或 VS IDE 进行了一些更改以在该 PC 上使用正斜杠。

    Linux 使用正斜杠,但 Windows 默认不使用。

    您可以打开C盘的文件夹查看路径是否使用了正斜杠。并确定你是否已经运行了一些 cmd 命令来使用它。

    打开VS IDE,对比两台电脑的两个版本,打开Extensions-->Manage Extensions-->Installed到检查您是否安装了一些导致该问题的扩展。

    【讨论】:

    • 感谢您的建议,但它不起作用;它仍然会创建一个包含反斜杠的 ZIP。是的,我知道 DOS/Windows 使用反斜杠作为路径分隔符,但是,这违反了 ZIP 文件规范。如果您阅读了我在问题中包含的链接,那么 4.6.1 的 DotNet 版本(显然)使用正斜杠正确创建 ZIP 文件。它与 Windows 本身无关。不,我没有对 Visual Studio 或我在另一台 PC 上安装的 Windows 执行任何操作来更改默认路径分隔符行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多