【问题标题】:Use msbuild on solution to call custom target on some projects在解决方案上使用 msbuild 在某些项目上调用自定义目标
【发布时间】:2017-05-18 01:01:16
【问题描述】:

我一直在尝试找出一种适当的方法来利用一个相当大的 c++ 代码库的解决方案文件中已经存在的信息。

我要解决的问题是在解决方案中的某些项目文件上调用外部脚本,但要观察解决方案和单个项目文件中指定的已经存在的依赖项。

通过将自定义目标添加到我的项目文件之一并在 vcxproj 文件上使用带有 /t:{TargetName} 命令的 msbuild,我已成功调用所述 (python) 脚本。

我现在可以将此目标添加到需要调用此脚本的每个项目文件中,然后以正确的顺序为每个项目文件调用 msbuild,但这违背了利用解决方案已知的依赖项的目的。

但是,使用自定义目标调用解决方案不起作用(如其他 stackoverflow 问题所示:Invoke Custom MSBuild Target on Solution File)。

另一方面,由于我希望能够仅调用脚本目标而不依赖于调用某些构建命令,因此我无法在添加 Post 或 PreBuild 目标的某些答案中使用建议的解决方法。

有没有其他方法可以使用依赖项而不必走 msbuild 和自定义目标的路线,或者是否有其他解决方法可以满足我的目的?

【问题讨论】:

    标签: c++ visual-studio-2015 msbuild target


    【解决方案1】:

    有没有其他方法可以使用依赖项而不必走 msbuild 和自定义目标的路线,或者是否有其他解决方法可以满足我的目的?

    您可以通过编程方式构建sln,这里有一个带有c#的控制台APP供您参考。

    using Microsoft.Build.Construction;
    using Microsoft.Build.Evaluation;
    using Microsoft.Build.Framework;
    using Microsoft.Build.Logging;
    using System;
    
    namespace LoadAllProject
    {
        class Program
        {
            static void Main(string[] args)
            {
                ILogger logger = new ConsoleLogger();
                string solutionPath = @"D:\Project\Msbuild\CppApp5\CppApp5.sln";
                var solutionFile = SolutionFile.Parse(solutionPath);
                foreach (var item in solutionFile.ProjectsInOrder)
                {
                    Project project = ProjectCollection.GlobalProjectCollection.LoadProject(item.AbsolutePath);
                    project.SetGlobalProperty("Configuration", "Debug");
                    if (project.GetPropertyValue("RootNamespace") == "CppApp5")
                    {
                        project.Build(new[] { "Build", "Yourcustomtarget" }, new[] { logger });
                    }
                    else
                    { 
                        project.Build(new[] { "Build" }, new[] { logger });
                    }
                }
                Console.ReadKey();
            }
        }
    }
    

    【讨论】:

    • 稍加修改后,我就可以为所有指定了自定义目标的项目调用脚本。太棒了。但是,使用解决方案文件中的依赖项的一个重要原因是我们可以并行执行一些项目(即没有依赖项的项目)。我还没有完全弄清楚如何告诉所有项目“在所有依赖项完成后立即运行”。
    • 据我所知,此方法不支持并行。
    • 是的,我想通了。但是,我能够使用您的基本想法和一些依赖项解析来到达我想去的地方。所以,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2012-08-15
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多