在解决方案上使用msbuild在某些项目上调用自定义目标

时间:2017-01-03 20:37:40

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

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

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

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

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

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

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

是否还有其他方法可以使用依赖项而无需使用msbuild和自定义目标的路径,还是有其他解决方法可以满足我的目的?

1 个答案:

答案 0 :(得分:0)

  
    

是否还有其他方法可以使用依赖项而无需使用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();
        }
    }
}