在解决方案上使用 msbuild 在某些项目上调用自定义目标
Use msbuild on solution to call custom target on some projects
我一直在努力找出一种正确的方法来利用已经存在于相当大的 c++ 代码库的解决方案文件中的信息。
我试图解决的问题是对解决方案中的一些项目文件调用外部脚本,但观察解决方案和单个项目文件中指定的已经存在的依赖项。
我通过将自定义目标添加到我的一个项目文件并在 vcxproj 文件上使用 msbuild 和 /t:{TargetName} 命令成功调用了所述 (python) 脚本。
我现在可以将此目标添加到每个需要调用此脚本的项目文件,然后以正确的顺序为每个项目文件调用 msbuild,但这违背了利用解决方案已知的依赖项的目的。
然而,使用自定义目标调用解决方案不起作用(如其他 Whosebug 问题所示:Invoke Custom MSBuild Target on Solution File)。
另一方面,由于我只想调用脚本目标而不依赖于调用某些构建命令,因此我无法在添加 Post 或 PreBuild 目标。
是否有任何其他方法可以使用依赖项而不必走 msbuild 和自定义目标的路线,或者是否有其他解决方法可以满足我的目的?
Is there any other way of using the dependencies without having to go the route of msbuild and custom targets, or is there an other workaround that could serve my purpose?
您可以通过编程方式构建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();
}
}
}
我一直在努力找出一种正确的方法来利用已经存在于相当大的 c++ 代码库的解决方案文件中的信息。
我试图解决的问题是对解决方案中的一些项目文件调用外部脚本,但观察解决方案和单个项目文件中指定的已经存在的依赖项。
我通过将自定义目标添加到我的一个项目文件并在 vcxproj 文件上使用 msbuild 和 /t:{TargetName} 命令成功调用了所述 (python) 脚本。
我现在可以将此目标添加到每个需要调用此脚本的项目文件,然后以正确的顺序为每个项目文件调用 msbuild,但这违背了利用解决方案已知的依赖项的目的。
然而,使用自定义目标调用解决方案不起作用(如其他 Whosebug 问题所示:Invoke Custom MSBuild Target on Solution File)。
另一方面,由于我只想调用脚本目标而不依赖于调用某些构建命令,因此我无法在添加 Post 或 PreBuild 目标。
是否有任何其他方法可以使用依赖项而不必走 msbuild 和自定义目标的路线,或者是否有其他解决方法可以满足我的目的?
Is there any other way of using the dependencies without having to go the route of msbuild and custom targets, or is there an other workaround that could serve my purpose?
您可以通过编程方式构建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();
}
}
}