【问题标题】:Run MSBuild from powershell without specifying .Net version在不指定 .Net 版本的情况下从 powershell 运行 MSBuild
【发布时间】:2015-08-25 13:28:59
【问题描述】:

我创建了一个 Powershell 脚本,用于按照 Scott Guthrie 在此处解释的示例Automate Everything (Building Real-World Cloud Apps with Azure) 部署我的 Web 应用程序 它使用此 MSBuild 调用来构建和发布 Web 应用程序

& "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" $ProjectCsproj `
/p:VisualStudioVersion=12.0 `
/p:DeployOnBuild=true `
/p:PublishProfile=$PublishXmlFile `
/p:Password=$Password

如您所见,此示例假定 .Net 框架版本为 4.0.30319,并且对于其他版本(或未来的 .Net 安装)将失败

有没有办法在不假设任何特定 .Net 版本的情况下运行此 MSBuild 命令?

【问题讨论】:

    标签: .net powershell msbuild azure-web-app-service


    【解决方案1】:

    您可能希望从 Powershell 本身中找到所需的 .NET 构建器,因为它在基本命令集中有足够的工具。如果您使用另一个版本的 .NET Framework 来构建您的项目,可能会有一些技巧,例如缺少或过时/弃用的类、属性、方法,或者可能会导致您的项目无法运行的语法或类依赖项的更改在新的 .NET 版本下正确构建。但是,您可以尝试枚举构建器并找到最接近 v4.0.30319 的构建器。一个例子:

    $builders= get-childitem "$env:windir\Microsoft.NET" -recurse -filter "MSBuild.exe"
    $builders | select -expand FullName
    

    这将显示可用的MSBuild.exe 文件名,这些文件名可以构建您的项目。然后您解析FrameworkFrameWork64 以获得64 位或32 位构建器,然后通过您喜欢的任何算法从列表中进行选择。 (我怀疑你永远需要这个技巧。)

    【讨论】:

    • 是的,Get-ChildItem 中的 -filter 参数比我使用 ForEach-Object 更快。
    【解决方案2】:

    你可以找到像这样的可用 MsBuild.exe 文件

    Dir $env:windir\Microsoft.NET\Framework -Recurse -File | ? {$_.Name -like "MSBuild.exe"} | Resolve-Path
    

    如果您对目录名称设置额外的限制,则可以进一步优化此 oneliner。

    然后,您可以实现自己的逻辑,在此处选择版本并在根本找不到任何内容时执行。例如,您可以通过使用正则表达式和/或适用于路径的 .NET 函数来选择可能的最新版本。

    【讨论】:

    • 有趣,我现在检查之前不知道dirGet-ChildItem 的别名。
    • 它实际上在 Windows 管理员中很普遍。一般来说,在脚本中或回答问题时使用别名是一种不好的风格,但 Dir 确实是个例外)
    猜你喜欢
    • 2010-10-03
    • 2010-10-03
    • 2017-10-14
    • 2010-12-20
    • 2022-06-13
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多