我正在努力将我们的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来控制构建…
我不得不做一些改动。
- 在构建服务器上安装Windows 10 SDK。在我的情况下,安装SDK"显示";潜在的错误是MSBuild没有生成*.dll。许可证文件。
- 添加/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
创建target
、complist
和outdir
参数。最后,我们将执行LC.exe
命令及其参数。