问题标签 [msbuild-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
854 浏览

c# - 使用 API 时从 MSBUILD 中跳过/排除项目类型

我正在使用 MSBUILD API 来构建使用服务的解决方案。

例如

我想要做的是传入排除项目类型或扩展的列表。首先,我想排除:

  • 数据库项目
  • WinRT 项目
  • 通用 MSBUILD 文件(无项目类型 GUID)。

有没有办法通过将一些参数传递给 MSBUILD 管理器来解决这个问题?

0 投票
1 回答
146 浏览

c# - 使用 MSBuild API for VC++ 时存在用户名差异?

我已经开始直接使用 MSBuild API 来扩展我们的构建过程并增加灵活性。

我已经成功地自动化了构建我们项目的整个过程,但并非没有一些“陷阱”。由于 MSBuild API 上极度缺乏文档和使用示例,我不得不忍受一些冗长的调试会话。

希望我在这里概述的详细信息将帮助其他希望直接与 MSBuild API 集成的人。

编译 C# 代码非常简单,但是一旦我尝试使用 MSBuild API 编译我们的一些遗留 VC++ 项目,这个过程就遇到了困难。

这是我的编译器包装器的代码示例:

此过程的另一个方面涉及 .props 文件,VC++ 使用该文件来获取链接器所需的 INCLUDE(和其他路径)。此 .props 文件位于 C:\Users\%BUILDACCOUNT%\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.%TargetPlatform%.user.props

现在是有趣的部分。

当我针对 C# 项目/解决方案运行此代码时,一切正常。这是因为 .props 文件在 C# 编译中不起作用(包含路径存储为 .csproj 级别)。

但是,当针对包含 VC++ 项目的解决方案运行时,这种方法完全落空了。原因是它无法解析可能位于 props 文件中的 INCLUDE 路径(位于上面详述的位置)。

另一个有趣的花絮是我可以直接从命令行复制参数到 MSBuild,并且构建成功。这真的让我感到困惑......所以我打开了详细诊断并再次运行我的测试用例。

日志中的有趣信息(日志已被修剪):

  1. 从命令行构建

用户域 = [已编辑]

用户名 = 我的用户名

LOCALAPPDATA = C:\Users\MyUserName\AppData\Local

  1. 从 API 构建

用户域 = [已编辑]

用户名 = 建造机 $

LOCALAPPDATA = C:\Windows\system32\config\systemprofile\AppData\Local

如您所见,从 CLI 构建时的当前身份似乎已正确设置为我的身份。但是,从 API 构建会将当前身份设置为本地系统。这会导致没有为 API 构建正确设置 INCLUDE 路径,因为包含该信息的 props 文件在预期位置 (C:\Windows\system32\config\systemprofile\AppData\Local) 不可用。

到目前为止似乎有效的解决方法是将所有道具文件从 AppData 位置实际移动到 API 期望它所在的目录。我不认为这是预期的行为......它似乎不是非常易懂。

补充说明:

  • 此代码托管在 IIS 上,位于以“MyUserName”(不是本地系统)运行的应用程序池中。
  • 我已经能够在运行 Windows Server 2008 的两台不同机器上重现此问题

是我做错了什么,还是 MSBuild API 做错了什么?有关获取 MSBuild API 识别的 props 文件的官方方法的任何输入都将非常有帮助。

谢谢。

0 投票
1 回答
73 浏览

c# - 加载包含作为通配符的项目的 .NET 项目

我已经发现,在我的 C#/F# 代码中,我可以加载有关任何 .NET 项目的信息,使用

哪里collection是类型ProjectCollection。然后,我可以访问项目中定义的所有属性和项及其所有依赖项。例如,我可以通过Compile以下方式访问包含的所有文件

假设我想在我的 fsproj 文件中定义一个自定义 ItemGroup:

一些评论:

  • MyGroup是我的自定义集合标识符。我发现这样的事情是允许的
  • “TestFiles”文件夹包含 4 个文件,它们都存在于某些子文件夹中,但它们都匹配模式“TestFiles\**\*”

当我使用开头提到的方法加载项目并运行时

我只得到一项,即“Test.txt”。除非我在 fsproj 中明确定义它们(即没有通配符),否则不会发现其他文件。

有没有办法让我也发现使用通配符包含的文件?我什至很高兴让它们以未解决的形式出现。因此,获取“TestFiles\**\*”而不是匹配模式的特定文件也可以。

0 投票
1 回答
43 浏览

c# - 什么 API 可以获取或评估 MSBuild.exe.config 中定义的全局变量?

我正在编写一个应用程序来评估(但不构建)*.csproj 和其他项目文件。

该应用程序模拟 MSBuild 所做的事情。它使用Microsoft.Build.dll实例公开的(记录在案的)公共 API,这些 API 安装在 Visual Studio 文件夹中,例如:

在这些目录中有一个MSBuild.exe.config文件,其中包含如下msbuildToolsets部分:

这些条目定义了在评估 *.csproj 时设置的全局变量的值。

dotnet/msbuild 源代码中,我看到:

  • 在类中(在命名空间中)GetMSBuildSDKsPath()定义了一个类似的函数,它是一个类。IntrinsicFunctionsMicrosoft.Build.Evaluationinternal static
  • 这个函数的实现委托给BuildEnvironmentHelper(在Microsoft.Build.Shared命名空间中),它也是一个internal类。

在调用 MSBuild 时正确设置这些全局变量至关重要,例如在调用ProjectCollection.LoadProject方法以返回Project实例时(否则项目将不会加载)。

设置这些变量的 API 是通过globalProperties参数将它们传递给ProjectCollection-- 但我不知道如何获取或评估我应该设置的这些属性的值。

我的问题是——我怎样才能读取这些变量(假设上面列出的类是“内部”)?是否有一个公共 API 可以做到这一点?

如有必要,我可以在 MSBuild bin 文件夹中运行我的应用程序,和/或复制MSBuild.exe.config文件。