*.dll.licenses obj 目录中的文件不是使用 TeamCity 中的 msbuild 创建的

*.dll.licenses file in obj directory not created with msbuild in TeamCity

我正在努力将我们的 TeamCity 项目从 VS2012 升级到 VS2015,我 运行 遇到了编译 MVC 应用程序的问题。

旧版 MSBuild (v4.0.30319.34209) 在 obj 目录中生成一个名为 MyApplication.Web.Mvc.dll.licenses 的文件,这显然是构建所必需的,但我们不知道该文件实际用于什么。

新的 MSBuild (v14.0.23107.0) 不会创建此 MyApplication.Web.Mvc.dll.licenses 文件,因此构建失败并出现以下错误:

CSC error CS1566: Error reading resource 'MyApplication.Web.Mvc.dll.licenses' 
-- 'Could not find file 'C:\BuildAgent\workddf5f1234d8c8a\application\MyApplication\MyApplication.Web.Mvc\obj\Release\MyApplication.Web.Mvc.dll.licenses'.' 

我已经 运行 通过机器上的 cmd 手动构建,每当 运行 使用旧的 msbuild 而不是新的构建时,就会创建 dll.licenses 文件.

该文件是在开发机器 运行 VS2015 上创建的,但不是在 Teamcity 构建服务器上创建的。所以在我看来,其他东西已经过时了?

经过更多的谷歌搜索,我偶然发现了 this thread on MSDN

此处建议的解决方案是安装 Windows 10 SDK。我们使用默认安装选项在我们的 TeamCity 构建服务器 运行 Windows Server 2012 R2 上执行此操作,重新启动后,我们的构建再次运行。

希望这对您有所帮助:)

可能对某人有帮助:

安装 Windows 10 SDK 并重新启动我的服务器后,我已将 /p:VisualStudioVersion=14.0 /p:TargetFrameworkVersion=v4.5.2 添加到我的 msbuild.exe。这解决了我的问题。

我们在使用 VisualBuild 构建时遇到了同样的问题。 我找到了不安装Win10 SDK的解决方案:

在项目属性编译设置中,我们添加了一个 "Pre-build Event Command Line",如下所示:

pushd "%VS120COMNTOOLS%..\..\VC"
call vcvarsall.bat
popd
pushd $(ProjectDir)\"My Project"
lc /target:$(TargetFileName) /complist:licenses.licx /outdir:"..\obj$(ConfigurationName)"
popd
popd

此命令使用(较旧的)VS12 工具并在构建项目之前手动启动 lc 编译器工具,并将 licenses.licx 文件编译到 *.licenses 资源文件中

答案 "Install the Windows 10 SDK" 基本上是正确的。 但是还有一个额外的陷阱:这个 SDK 存在不止一个版本:https://developer.microsoft.com/en-us/windows/downloads/sdk-archive

通过撰写此评论:

  • 2015 年 7 月(版本 10.0.26624.0)包含 .NET Framework 4.6 SDK
  • 11 月2015(版本 10.0.10586.212)包含 .NET Framework 4.6.1 SDK
  • 八月2016(版本 10.0.14393.0)包含 .NET Framework 4.6.2 SDK

检查您的 VS 2015 输出以及调用的 LC.exe 的版本。然后在构建服务器上安装适当的 SDK。别忘了安装 Microsoft Build Tools 2015。

注意:我的构建目标是 .net 4.5,但需要以上版本才能使用 2015 工具在 TeamCity 上构建。

在我的例子中,TFS 使用旧版 SDK 文件夹

中的许可编译器lc.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\lc.exe

而不是

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64\LC.exe

此问题已通过向构建定义添加以下 msbuild 参数得到解决:

/p:FrameworkOverride="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2"

您还可以通过在构建服务器上安装 visual studio 并添加 visual studio 构建步骤来替换您的 2015 msbuild 步骤

来摆脱这些问题并让您的生活更轻松

这是一个密切相关但略有不同的情况,因为我正在使用 Jenkins 来控制构建...

我不得不做出一些改变。

  1. 在构建服务器上安装了Windows 10 SDK。在我的例子中,安装 SDK“揭示”了潜在的错误,即 MSBuild 没有生成 *.dll.licenses 文件。
  2. 在我的构建参数中添加了 /tv:14.0 ( /ToolsVersion:14.0 )。

/p:Configuration=Release /p:VisualStudioVersion=14.0 /tv:14.0 /verbosity:Normal

  1. 作为执行 MSBuild 步骤之前的一个步骤,手动创建了许可证文件。以下命令创建文件“myproject.dll.licenses”.

cd "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools"

.\lc.exe /target:MyProject.dll /complist:"C:\Program Files (x86)\Jenkins\jobs\MyProject\workspace\MyProject\licenses.licx" /i:"C:\Program Files\nsoftware\E-Payment Integrator V6 .NET Edition\lib\nsoftware.InPayWeb.dll" /outdir:"C:\Program Files (x86)\Jenkins\jobs\MyProject\workspace\MyProject\obj\Release"

我使用 Atlassian Bamboo 作为我们的构建服务器,但在其他方面遇到了与此处描述的完全相同的问题。我尝试了该线程中的所有解决方案,但无法正常工作。最后,我使用了 Visual Studio 2017 附带的新版 MSBuild,突然我的许可证 dll 被正确创建了。就我而言,MSBuild.exe 可以在以下位置找到:

C:\Program Files (x86)\Microsoft Visual Studio17\BuildTools\MSBuild.0\Bin\MSBuild.exe

在我们的例子中,我们使用 Atlassian Bamboo 作为带有构建代理的构建服务器 运行 Windows Server 2012(不是 R2)。因此,安装 Windows 10 SDK 或 Visual Studio Build Tools 2017 或 2019 不是一个选项,因为它不会安装在 Windows Server 2012 上,因为它不符合系统要求。

我通过添加到 VS 项目的预构建事件获得了它。 (感谢 Joseph Haslinger

添加到项目属性的预生成事件使用以下命令调用 PowerShell 脚本: powershell.exe -ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(ProjectDir)pre-build.ps1 $(ProjectDir) $(TargetFileName)

该命令基于 Jiří Činčura of tabs ↹ over ␣ ␣ ␣ spaces

中的命令

I’m setting ExecutionPolicy to Bypass in case somebody would not have it set to Unrestricted. I’m using NoProfile as I often use plain PowerShell and loading my profile would just slow it a bit. Of course NonInteractive because, well, there is no interaction possible. And finally the File with my script file.

我添加了 $(ProjectDir) 来调用 PowerShell 脚本和作为脚本的参数,前者是为了确保脚本可以在构建代理上找到(可能不需要,但为了安心。 ..) 后者是因为 LC.exe 找不到 licenses.licx 文件和输出目录。 另一个参数 $(TargetFileName) 添加项目目标文件名以在 LC.exe 命令的 /target: 参数中使用。

PowerShell 脚本本身...

param(
    [String]$projectDir,
    [String]$targetFileName
)
if(Test-Path 'env:bamboo_agentId') {
    if(-not($projectDir)) { Throw "A value for -projectDir must be supplied!" }
    if(-not($targetFileName)) { Throw "A value for -targetFileName must be supplied!" }
    Write-Host "`r`nOn Bamboo build server, executing pre-build script"
    Write-Host "Supplied -projectDir: $projectDir"
    Import-Module NTFSSecurity

    trap {"Error found: $_"; exit 1;}
    $lcpath = Get-ChildItem2 -Path "C:\Program Files (x86)" -Filter "lc.exe" -Recurse -File | 
    Sort-Object -Property LastWriteTime -Descending | 
    Select-String -inputobject {$_.FullName} -Pattern ".*(x64|amd64).*" | 
    Select-Object -First 1

    $argTarget = "/target:$targetFileName"
    $argCompList = "/complist:$($projectDir)My Project\licenses.licx"
    $argOutdir = "/outdir:$($projectDir)obj\Release"

    Write-Host "`r`nCreating licenses file"
    Write-Host "Executing command: $lcpath $argTarget $argCompList $argOutdir"
    & $lcpath $argTarget $argCompList $argOutdir

} else {
    Write-Host "Not on Bamboo build server, skipping pre-build actions."
}

首先我们检查 bamboo_agentId 环境变量是否存在,表明我们在 Bamboo 构建代理上,在本地开发机器上没有必要执行脚本。当我们知道我们在 Bamboo 构建代理上时,我们检查两个参数是否都是 supplied.Then 我们将搜索 C:\Program Files (x86) 以获取 LC.exe 的最新 64 位副本。接下来我们将为 LC.exe 创建 targetcomplistoutdir 参数。最后我们将执行 LC.exe 命令及其参数。