问题标签 [msbuild-15]

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 回答
1015 浏览

c# - 具有项目依赖项的解决方案的 MSBuild 失败

我的解决方案的构建包含多个项目,突然出现故障,问题的原因尚不清楚。解决方案中的所有项目都针对相同的框架 (4.5.1),但是,某些项目的依赖项可能针对框架的早期版本。截至上周,我们能够成功构建属于这种情况的解决方案。从上周四开始,构建似乎被破坏,而构建服务器或解决方案没有任何更改。

为了说明和消除我们的生产设置的一些复杂性,我创建了一个模拟行为的示例解决方案。

项目结构:

  • CBI 解决方案
    • CBI 网站
    • CBI 实现库
    • CBI Core 库,定义接口

网站和类库的目标框架版本是 4.5.1

复制步骤

解决方案 1

Github 仓库:https ://github.com/NikitaGolovko/Solution1.git

使用 MSBuild 14 构建。我的命令是:

输出

完整输出位于此处:https ://github.com/NikitaGolovko/Solution1/blob/master/MSBuild_Output.txt

解决方案 2

Github 回购:https ://github.com/NikitaGolovko/Solution2.git

该解决方案与解决方案 1 几乎相同,唯一的例外是 CBI 实现库中的 Unity 依赖项。为了简化过程并消除 nuget 还原步骤,我在解决方案中包含了 nuget 包。

使用 MSBuild 14 构建。我的命令是:

输出

完整输出位于此处:https ://github.com/NikitaGolovko/Solution2/blob/master/MSBuild_Output.txt

观察

文件夹

在查看网站的 bin 文件夹时,我注意到 CBILite.dll 在为解决方案 2 构建后丢失,但存在于解决方案 1 中。

目标框架版本

在 MSBuild 参数中传递TargetFrameworkVersion似乎不会影响构建。我试图通过 4.5、4.5.1 无济于事。但是通过 3.5 会导致成功构建。这非常奇怪。

元项目

在比较为这两种解决方案生成的 Metaproj 文件时,唯一可观察到且看似重要的区别是缺少TargetFrameworkVersion元素。解决方案 1(无依赖项),包含v.4.0元素。解决方案2(具有依赖项)没有。我没有在 repo 中包含 metaproj 文件,但如果需要可以共享它们。

视觉工作室

在 Visual Studio 中构建解决方案效果很好。

额外的想法

这个问题表现得相当突然,似乎影响了我们大多数具有混合项目的解决方案(C#/VB + 网站)。Web 项目继续正常运行。

我尝试使用 MSBuild 15,但它导致了相同的行为。

有一些解决方法

  1. 使用解决方案保留 metaproj 文件并通过添加 v4.5.1 元素手动修改它。
  2. 添加额外的构建步骤以手动将 CBILib.dll 复制到网站项目中(通过批处理文件或其他方式)。
  3. 为指向 CBILib/bin/Release 文件夹的网站添加刷新文件

虽然所有这些解决方案都可能有效,但它们肯定是黑客行为,并且将来会出现问题。

我希望其他人对如何处理这个问题有更好的建议。

0 投票
5 回答
2421 浏览

c# - 在 TargetFrameworks 标记中每个框架运行一次的目标之前,如何制作只运行一次而不是一次的 MSBuild 目标?

我有一个我部分拥有的代码生成器工具,现在 csproj 文件可以在其中列出多个目标框架并构建所有这些框架,我试图弄清楚如何使 MSBuild 目标每次只生成一次代码运行构建,无论列出了多少个目标框架,并让每个目标框架的编译等待代码生成完成。

我目前的条件是 TargetFramework 的特定值。例如,Condition="'netstandard2.0' == '$(TargetFramework)'"

这避免了同时为每个目标框架启动代码生成工具,然后在进程尝试创建/更新相同文件时出现访问被拒绝错误。

但是,其他目标框架直接尝试编译而不等待代码生成完成,并且在没有该代码的情况下失败。

我希望每次构建项目时只发生一次代码生成,并且只有在完成后才开始为每个目标框架进行编译。

每次运行构建时都需要运行它,以防输入发生变化并生成不同的代码。

注意:目前我忽略了一种情况,#if FrameworkSpecificDefine即代码生成器使用不同的输入代码,这样不同的目标框架会导致代码生成器的输出不同。目前,我认为代码生成器的输出在所有目标框架中都是相同且有效的。

更新:在寻找在 MSBuild 拆分为 TargetFramework 特定构建之前发生的目标之后,我可以在此之前挂钩构建,我在 VS 的详细构建输出中看到了这一点:

然后我将我的目标设置为BeforeTargets="DispatchToInnerBuilds",它在专门设置 TargetFramework 的个人构建之前运行,并且似乎完全满足我的需求。

(添加到BuildDependsOn属性似乎不再起作用:添加在 Visual Studio 2017 RC 中构建 .NET Core 项目后运行的 msbuild 任务;我怀疑 Microsoft.Common.targets 稍后会以新的 csproj 格式进行评估,并且您在项目文件中执行的任何附加到属性的操作都将被 Microsoft.Common.targets 覆盖。)

0 投票
2 回答
1233 浏览

visual-studio - 意外字符''

从 VS2013 迁移到 VS2017 后,我遇到了意外的字符问题。

在 msbuild 12.0 和 VS2013 中一切都很好,但是当迁移到 15.0 时,我收到了数百个:

CS1519 无效令牌“?” 在类、结构或接口成员声明中

在 msbuild 命令行中。

在 VS2017 中构建返回:

CS1056 意外字符 ''

错误发生在(B该区域之间的 Ch66。隐藏的字符?在写字板中变为 a。但是,如前所述,相同的代码在 msbuild 12.0 中构建良好。删除所有代码并重新下载表单 TFS 并没有解决问题

解决方案代码

注意:在代码中搜索change_me并确保更改为您想要的任何项目。

0 投票
0 回答
431 浏览

jenkins - SonarQube 并行构建:System.IO.IOException:文件 SonarQube.Integration.ImportBefore.targets 已经存在

在 Jenkins 中运行涉及 SonarQube Scanner for MSBuild 的多个不同并行作业时,此异常会立即终止构建作业:

在没有其他涉及扫描仪的作业正在运行时重新启动构建作业似乎成功完成了构建。

0 投票
1 回答
662 浏览

nuget - 如何为 projectReference 设置特定于构建的版本号,以便 NuGet 包依赖项列出正确的版本

CreateLocalPackages使用 Visual Studio 2017 中的新 CSProj 格式,我编写了一个目标文件来处理一个名为该文件夹中任何解决方案包的最高编号。

我的解决方案有几个项目,每个项目都构建一个 NuGet 包,其中一些项目依赖于解决方案中的其他项目。

例如,使用本地包目录中的这些文件:

下次CreateLocalPackages配置干净构建时,它将选择创建这些包:

我已经很好地工作了,除了 Visual Studio 似乎BaseLibrary\BaseLibrary.Specialized\obj\project.assets.json在我可以挂接到 MSBuild 目标并将 $(Version) 更改为 之前创建文件2.1.0.2,导致BaseLibrary.Specialized.2.1.0.2-betalocal.nupkg只引用此依赖项:BaseLibrary.2.1.0-betalocal. Visual Studio 似乎project.assets.json在调用 MSBuild 构建项目之前执行的 NuGet 还原步骤期间生成。

我已经尝试运行我的版本号逻辑BeforeTargets="CollectPackageReferences;_ComputeTargetFrameworkItems"以便在Restore目标链的早期被调用,但它似乎不像 Visual Studio 调用MSBuild /t:Restore来恢复 NuGet 包引用(并生成project.assets.json)。我不知道它是否有自己的逻辑,或者它是否调用了另一个工具。

我希望能够告诉 VS 重建并让它找出新版本,构建和打包所有内容,并列出正确的依赖版本。

0 投票
1 回答
95 浏览

c# - MSBuild15 CS0121 模棱两可的'列表.List(params T[])' 和'列表.List(参数列表[])'

以下代码将在 MSBuild12 中编译,但在 MSBuild15 中将失败

结果

CS0121 以下方法或属性之间的调用不明确:'List.List(params T[])' 和 'List.List(params List[])' 示例 D:\Example\Test.cs

在 MSBuild 12 中,此构造函数默认为。 显示调用的默认构造函数

0 投票
2 回答
2520 浏览

msbuild - 将 MSBuild 15 的规则集放在哪里(Visual Studio 2017 的构建工具)

在我的构建上启用静态代码分析时,我收到 MSBuild 引发的以下错误:

C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\Microsoft.CSharp.CurrentVersion.targets(134,9):警告 MSB3884:找不到规则集文件“AllRules.ruleset” . [C:\Program Files\VSTS Agent_work\PATH_TO_MY.csproj]

要让静态代码分析在构建代理(只有 MSBuild,没有 Visual Studio)上工作,对于旧版本的构建工具,我们应该:

  1. 复制C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\Rule Sets\到构建服务器
  2. 添加指向该文件夹的注册表项

(另请参阅此错误报告

但是,这些说明不适用于"Build Tools for Visual Studio 2017"。我想知道如何解决这个问题,而不需要将规则集复制到我自己的存储库或更改我的 csproj 中的任何内容?

更新:

我尝试设置以下注册表项,但无济于事:

通过注册表挖掘,我发现了以下注册表项。在我的机器上,我已经安装了 VS2017 Build Tools 和 Test Agent,这似乎指向后者,这是我在安装 Build Tools 后安装的:

更新 2:
两个答案都提到了 file Microsoft.CodeAnalysis.Targets。但是,我的构建服务器上不存在此文件。我尝试从我的 VS2017 安装中复制此文件夹:

但是,除了找不到规则集之外,它现在还会引发有关无法找到的错误Microsoft.WebApplication.targets

XXX.csproj(296,11):错误 MSB4226:导入的项目“C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuil d\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.目标”没有找到。此外,尝试在 $(VSToo lsPath) 的后备搜索路径中找到 "WebApplications\Microsoft.WebApplication.targets" - "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v15.0" 。这些搜索路径在“C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe.Config”中定义。确认声明中的路径正确,并且该文件存在于磁盘上的搜索路径之一中。

0 投票
1 回答
231 浏览

.net - 如何在 MBUILD 15 中设置带有 * 的 AssemblyVersion 用于自动构建编号?

我仍然想让我的新 csproj 使用新的 msbuild 为我的库生成版本号。但是,如何允许使用 asterix*占位符填充随机内部版本号的旧 msbuild 行为?

0 投票
1 回答
1702 浏览

msbuild - 将 ProjectReference 视为 PackageReference 或允许 PackageReference 到本地 csproj

我有一个 netstandard2.0 csproj(我们称之为 MyPackage),它在构建时(由 GeneratePackageOnBuild 指定)打包到一个 nuget 包中。这个 nuget 包在构建目录中有自定义的道具和目标(因此引用项目会导入这些)。

我在同一个解决方案中有另一个项目(我们称之为 MyConsumer)来测试 MyPackage。我希望 MyConsumer 在构建时从 MyPackage 导入构建资产道具和目标,就像它作为来自某个远程 nuget 源的 PackageReference 一样使用它。

我怎样才能得到这个工作(最简单)?

我已经能够通过一个非常复杂的方法来做到这一点,我让 MyConsumer 将 PackageReference 添加到 MyPackage 并覆盖 MyConsumer 中的 RestoreSources 以指向 MyPackage 的 bin 目录。当运行 dotnet build 或 Visual Studio build 的 sln 时,这会变得非常奇怪,因为项目元数据是在还原期间为所有项目预先生成的,因此此时 MyPackage 不存在。解决方案是在 MyConsumer 项目中添加对 MSBuild 的嵌套调用,但这变得更糟,因为 Visual Studio 还原的操作与 dotnet build 执行的自动还原完全不同。

有什么简单的方法可以做到这一点吗?

这就是我现在所拥有的

0 投票
1 回答
683 浏览

msbuild - MSBuild 15 csproj 与 NuSpecFile

我们正在努力迁移到 PackageReference 恢复样式 csproj,但对于此类项目有许多 nuspec,它们依赖于一些默认的 nuget pack CLI 行为。具体来说:

  • 版本替换
  • 依赖项部分的自动生成
  • 自动生成文件部分

本质上,我希望在 csproj 上运行 dotnet pack,并让它使用 csproj 生成文件、依赖项和版本,但其余元数据的现有 nuspec 文件。

如果我在 csproj 中指定 NuSpecFile,它会正确使用 nuspec 文件,但不再生成基于 csproj 的文件、依赖项或版本。