c++ - 动态确定构建/触发事件的所有解决方案、项目和配置,并使用 MSBuild 从命令行/脚本调用它们

标签 c++ visual-studio-2008 msbuild

我们在设置构建自动化方面还处于早期阶段,目前仅将 bat 文件用于 Win32 C++ 解决方案。我们有大约 4 个解决方案,每个都有几个 vcproj 文件。

每次添加新的解决方案或配置时,我都必须更新 bat 文件以反射(reflect)新的解决方案或配置以使用 MSBuild 调用。

我想也许编写一个工具来解析给定路径(及其子树)中的所有 sln 文件,然后解析它为配置引用的所有项目文件,然后以这种方式调用所有构建会更容易。

有没有简单的方法来做到这一点?

真的这是 2 个问题:

  1. 如何让 MSBuild 仅在子树中构建所有解决方案? (我可以对它们进行搜索 - 这是我想编写的一个简单工具)

  2. 如何告诉 MSBuild 构建解决方案/vcproj 的所有配置?

我们正在使用 MSBuild、bat 文件、vc2008、c++

最佳答案

作为 PowerShell 的粉丝,以下重新格式化的单行代码可能会有所帮助:

Get-ChildItem -Recurse -Include *.sln | 
ForEach-Object {  
    $Solution = $_.FullName
    Get-Content $_ | 
    ForEach-Object { 
        if($_ -match '\{[^\}]+[^=]+= ([^\{\s]*)$') { 
            $matches[1] 
        }
    } | Sort-Object -Unique | 
    ForEach-Object { 
        $config =  ([string]$_).Split([char]'|')
        & "$env:windir\Microsoft.NET\Framework\v3.5\msbuild.exe" $Solution /p:Configuration="$($config[0])" /p:Platform="$($config[1])" 
    }
}

此脚本可以保存为 ps1 文件或作为函数粘贴到您的配置文件中。解释它的作用:

  1. 查找当前目录下的所有.sln文件
  2. 解析 sln 以提取配置和平台值
  3. 对于每个独特的配置平台组合,使用给定的解决方案调用 msbuild

--编辑:忘记拆分字符串是 PSCX 的一部分, 最好使用 [string] 我希望这有帮助。如果您仍想使用 MsBuild,它确实通过“.\**\*.sln”语法支持文件 glob 运算符的递归形式,请参阅 here了解详情。 MsBuild 还提供了 MsBuild 任务,可用于构建一组解决方案。我不知道如何在 msbuild 中轻松地从解决方案中获取所有“已知”配置。因此我选择了 PowerShell 路线。

关于c++ - 动态确定构建/触发事件的所有解决方案、项目和配置,并使用 MSBuild 从命令行/脚本调用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1025372/

相关文章:

c++ - 组织项目依赖

visual-studio-2010 - 像在 AfterBuild 中一样实现 BeforePublish

visual-c++ - 在 C++ 项目中使用 x86 平台

angular - 使用 Visual Studio 构建 Angular2 应用程序时出错

c++ - 抛出可由 C++98 和 C++1x 编译的析构函数。有没有更好的办法?

c++ - 在 C++ 代码中使用 new/delete 而不是 malloc/free 时崩溃

c++ - VS 静态字符串是否可写?

c++ - 模态对话框的 MB_TASKMODAL 标志

c++ - boost::asio::const_buffer 的安全释放

c# - C#、C++ 和 C 的混合