我在使用TeamCity自动化构建引擎时遇到问题。我需要构建许多vcxproject,其中一些是LIB或DLL,其余的是EXE文件,使用以前构建的LIB。
在TeamCity中设置一个LIB项目的示例是:
<runner id="RUNNER_15" name="MP3" type="MSBuild">
<parameters>
<param name="build-file-path" value="Audiomp3mp3.vcxproj" />
<param name="dotNetCoverage.NCover.HTMLReport.File.Sort" value="0" />
<param name="dotNetCoverage.NCover.HTMLReport.File.Type" value="1" />
<param name="dotNetCoverage.NCover.Reg" value="selected" />
<param name="dotNetCoverage.NCover.platformBitness" value="x86" />
<param name="dotNetCoverage.NCover.platformVersion" value="v2.0" />
<param name="dotNetCoverage.NCover3.Reg" value="selected" />
<param name="dotNetCoverage.NCover3.args" value="//ias .*" />
<param name="dotNetCoverage.NCover3.platformBitness" value="x86" />
<param name="dotNetCoverage.NCover3.platformVersion" value="v2.0" />
<param name="dotNetCoverage.NCover3.reporter.executable.args" value="//or FullCoverageReport:Html:{teamcity.report.path}" />
<param name="dotNetCoverage.PartCover.Reg" value="selected" />
<param name="dotNetCoverage.PartCover.includes" value="[*]*" />
<param name="dotNetCoverage.PartCover.platformBitness" value="x86" />
<param name="dotNetCoverage.PartCover.platformVersion" value="v2.0" />
<param name="msbuild_version" value="4.0" />
<param name="run-platform" value="x86" />
<param name="toolsVersion" value="4.0" />
</parameters>
</runner>
在DLL的情况下,vcxproj文件中的链接器设置显示:.\Release \$(ProjectName).dll在LIB的情况下,根本没有这样的设置。
当我使用VS2010命令行构建它时,输出为。\发布\mp3.dll或。\发布\mp3.lib.
但当我使用TC时,我会得到输出。\发布\mp3.vcxproj.dll或。\发布\mp3.vcxproj.lib
为什么?如何避免这种奇怪的行为?(我不想替换vcxproj文件中的行,如.\Release\mp3.dll,这是许多项目的问题,我想避免这种原始解决方案,在LIB项目的情况下根本没有这种可能性)
Thx用于任何响应。
我遇到了同样的问题,.vcxproj出现在我的二进制文件的文件名中。我将其缩小到使用TeamCity构建时与在自己的机器上构建时不同的$(ProjectName)变量。
对我来说,解决方案是在每个受影响的项目文件中定义ProjectName变量(奇怪的是,它似乎没有发生在某些类型的项目中,例如静态库)。
<!-- Define project name to avoid TeamCity from generating incorrect one -->
<PropertyGroup>
<ProjectName>NAME_OF_PROJECT</ProjectName>
</PropertyGroup>
我把它放在<PropertyGroup Label="UserMacros"/>线和<目标名称>引用它的定义。
我仍然不明白为什么TeamCity与众不同。。。我希望这能帮助其他有同样问题的人。
这里有一个解决此问题的方法,不需要更改项目文件中的任何内容。在调用任何项目构建之前,都会执行一个脚本,将所有感兴趣的.vcxproj
文件重命名为同名但没有.vcxproj
扩展名的文件。它是一个"命令行"运行程序,脚本是
for /r directorywith_projects %%%%f in (*.vcxproj) do rename %%%%f %%%%~nf
然后"Visual Studio"运行程序将重命名的项目文件作为参数。在内部,运行程序使用.teamcity
扩展名制作一个副本,Visual Studio会对其进行修剪,从而提供正确的$(ProjectName)
值。