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

Posted

技术标签:

【中文标题】obj 目录中的 *.dll.licenses 文件不是使用 TeamCity 中的 msbuild 创建的【英文标题】:*.dll.licenses file in obj directory not created with msbuild in TeamCity 【发布时间】:2015-11-29 09:17:28 【问题描述】:

我正在将我们的 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\work\58ddf5f1234d8c8a\application\MyApplication\MyApplication.Web.Mvc\obj\Release\MyApplication.Web.Mvc.dll.licenses'.' 

我一直在机器上通过 cmd 手动运行构建,并且每当使用旧的 msbuild(而不是新的 msbuild)运行构建时,都会创建 dll.licenses 文件。

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

【问题讨论】:

所以大概你有一个.licx file in one of your projects and some licensed components? @Nanhydrin 是的,我发现这是罪魁祸首。我仍然遇到 Visual Studio 2015 无法构建 .licenses 文件的问题。我打算在我弄明白的时候发布我的解决方案。 编辑:我的意思是 MSBuild v14 不会创建 .licenses 文件。 您是否打开了详细的构建输出并查看了带有 .licx 文件的项目的完整构建输出? @Nanhydrin 是的,我刚刚做了,服务器上的输出与我机器上的不同。在服务器上,它只是输出信息,就好像您在没有 .licx 文件的情况下调用了 lc.exe。这也存在:Task attempted to find "LC.exe" using the SdkToolsPath value "". Make sure the SdkToolsPath is set to the correct value and the tool exists in the correct processor specific location below it. 【参考方案1】:

经过一番谷歌搜索,我偶然发现了this thread on MSDN。

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

希望这会有所帮助:)

【讨论】:

这对我帮助很大。我们移至 MsBuild 2015,我们的 licenses.licx 文件不再编译为 /obj/ 文件夹中的 *.licences 文件。安装 Win 10 SDK 按照您的建议修复它 谢谢!!解决了我的问题。来吧,女士。把你的废话放在一起!!我不应该安装多个包并从我的开发系统复制文件夹来让 CSC 工作。 我必须安装 MS Build Tools 2015,因为 MSBuild 现在是独立安装包。 我发现您实际上不必安装整个 Windows10 SDK (2.5Gb),要消除此错误,只需选择 .Net Framework 4.6 软件开发工具包就足够了(~50Mb) 当您运行 Win10 SDK 安装程序时。 出于某种原因,在我的情况下,MSBuild 拒绝创建 *.dll.licenses 文件,即使在安装了 Windows 10 SDK 之后也是如此。我最终不得不自己调用 lc.exe 并生成许可证文件作为我的构建步骤之一。【参考方案2】:

“安装 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 十一月2015(版本 10.0.10586.212)包含 .NET Framework 4.6.1 SDK 8 月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 上构建。

【讨论】:

构建到 .Net 4.5 需要所有三个? 这里是上述 Windows 10 SDK 档案页面的链接。找到这些版本并在安装它们时取消选择除 .NET Framework 4.6.xxx SDK 之外的所有内容。 developer.microsoft.com/en-us/windows/downloads/sdk-archive 将我的 TeamCity 更改为使用 2015 版而不是 2013 版的 MSBuild 时,我需要 2015 年 7 月 / 4.6 SDK; 2016 年 8 月 / 4.6.2 SDK 没有为我解决丢失的 .licenses 文件问题。 (谢谢你,Alois!)【参考方案3】:

在我的例子中,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 步骤,从而摆脱这些问题并让您的生活更轻松

【讨论】:

类似的解决方案帮助了我。 /p:TargetFrameworkSDKToolsDirectory="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 工具"【参考方案4】:

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

C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe

【讨论】:

这也解决了我的问题,虽然路径略有不同:C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe 我的路径类似于上面的@MichaelWires,但这也解决了我的问题。 他们用 v15 更改了 msbuild 的安装路径。 Tom 很可能使用了独立的 Visual Studio 2017 构建工具,它将 msbuild 放入与 sku 无关的目录中。【参考方案5】:

可能对某人有帮助:

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

【讨论】:

/p:VisualStudioVersion=14.0 对我来说已经足够了。【参考方案6】:

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

在项目属性编译设置中,我们添加了一个“预构建事件命令行”,如下所示:

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 资源文件

【讨论】:

感谢@Josef——它让我走上了正确的道路。我必须自己手动创建 *.dll.licenses 作为构建步骤。 (虽然我能够使用最新版本的 lc.exe 实用程序。)【参考方案7】:

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

我不得不做出一些改变。

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

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

    在执行 MSBuild 步骤之前手动创建了许可证文件。以下命令创建文件“myproject.dll.licenses”。

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

.\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 版\lib\nsoftware.InPayWeb.dll" /outdir:"C:\Program Files (x86)\Jenkins\jobs\MyProject\workspace\MyProject\obj\Release"

【讨论】:

【参考方案8】:

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

我让它与添加到 VS 项目的预构建事件一起工作。 (感谢 Joseph Haslinger the idea)

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

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

我将ExecutionPolicy 设置为Bypass,以防有人将其设置为Unrestricted。 ? 我使用的是NoProfile,因为我经常使用普通的 PowerShell,加载我的配置文件只会减慢它的速度。当然NonInteractive 因为,嗯,不可能有交互。最后是 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 构建代理上时,我们会检查是否提供了两个参数。然后我们将搜索 C:\Program Files (x86) 以获取 LC.exe 的最新 64 位副本。接下来我们将为LC.exe 创建targetcomplistoutdir 参数。最后,我们将执行 LC.execommand 及其参数。

【讨论】:

以上是关于obj 目录中的 *.dll.licenses 文件不是使用 TeamCity 中的 msbuild 创建的的主要内容,如果未能解决你的问题,请参考以下文章

Makefile:不同目录中的 Cpp 文件,将目标文件重定向到 ./obj 和可执行文件到 ./bin

Linux makefile中的obj-y,请问是啥意思

如何计算每个目录中的文件数?

查找目录中的文件数

角度文本区域验证错误

如何使用 Python 计算目录中的文件数