* . dll.在obj目录下的许可证文件不是用TeamCity的msbuild创建的



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

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

New 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:BuildAgentwork58ddf5f1234d8c8aapplicationMyApplicationMyApplication.Web.MvcobjReleaseMyApplication.Web.Mvc.dll.licenses'.' 

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

该文件在运行VS2015的开发机器上创建,而不是在Teamcity构建服务器上创建。所以在我看来,还有什么东西过时了?

在google上搜索了一会儿之后,我在MSDN上偶然发现了这个帖子。

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

希望这有助于:)

答案"安装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 (Version 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。

在我的情况下,TFS使用旧SDK文件夹中的许可证编译器lc.exe

C:Program Files (x86)Microsoft SDKsWindowsv8.0AbinNETFX 4.0 Toolslc.exe

代替

C:Program Files (x86)Microsoft SDKsWindowsv10.0AbinNETFX 4.6 Toolsx64LC.exe

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

/p:FrameworkOverride="C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.6.2"

你也可以摆脱这些问题,让你的生活更容易通过安装visual studio构建服务器和添加一个visual studio构建步骤来取代你的2015年msbuild步骤

我使用Atlassian Bamboo作为我们的构建服务器,但否则有完全相同的问题在这里描述。我尝试了这条线的每一个解决方案,但无法得到任何工作。最后,我使用了Visual Studio 2017附带的新版本MSBuild,突然我的许可证dll被正确创建。在我的情况下,MSBuild.exe可以在以下位置找到:

C:Program Files (x86)Microsoft Visual Studio2017BuildToolsMSBuild15.0BinMSBuild.exe

可能对某人有所帮助:

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

我们在使用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 Tools,并在构建项目之前手动启动lc编译器工具并编译许可证。Licx文件放入*。许可资源文件

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

我不得不做一些改动。

  1. 在构建服务器上安装Windows 10 SDK。在我的情况下,安装SDK"显示";潜在的错误是MSBuild没有生成*.dll。许可证文件。
  2. 添加/tv:14.0 (/ToolsVersion:14.0)到我的构建参数。

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

  • 在执行MSBuild步骤之前手动创建许可证文件。下面的命令创建文件"myproject.dll.licenses"
  • cd "C:Program Files (x86)Microsoft sdk Windowsv10.0AbinNETFX 4.6.2 Tools"

    .lc.exe/target:MyProject.dll/complist:"C:Program Files (x86)JenkinsjobsMyProjectworkspaceMyProject permissions .licx"/i:"C:Program FilesnsoftwareE-Payment Integrator V6 .NET Editionlibnsoftware. inpayweb .dll"/outdir:"C:Program Files (x86)JenkinsjobsMyProjectworkspaceMyProjectobjRelease"

    在我们的案例中,我们使用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中的tabs已过,即

    我将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 Projectlicenses.licx"
        $argOutdir = "/outdir:$($projectDir)objRelease"
        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.exe命令及其参数。

    最新更新