【问题标题】:How to setup MSBuild to name Project.dll instead od Project.vcxproj.dll in TeamCity?如何在 TeamCity 中设置 MSBuild 以命名 Project.dll 而不是 od Project.vcxproj.dll?
【发布时间】:2015-02-12 05:17:07
【问题描述】:

我在使用 TeamCity 自动化构建引擎时遇到了问题。 我需要构建许多 vcxprojects,其中一些是 LIB 或 DLL,其余是 EXE 文件,使用以前构建的 LIB。

在 TeamCity 中设置一个 LIB 项目的示例是:

    <runner id="RUNNER_15" name="MP3" type="MSBuild">
      <parameters>
        <param name="build-file-path" value="Audio\mp3\mp3.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 命令行构建它时,输出是 .\Release\mp3.dll.\Release\mp3.lib

但是当我使用 TC 时,我会得到输出 .\Release\mp3.vcxproj.dll.\Release\mp3.vcxproj.lib

为什么?如何避免这种奇怪的行为? (我不想替换 vcxproj 文件中的行,如 .\Release\mp3.dll,这是许多项目的问题,我想避免这种原始解决方案,如果是 LIB 项目,则根本没有这种可能性)

感谢任何回复。

【问题讨论】:

  • 发生这种情况是因为 TeamCity 构建器重命名了项目文件,并为其添加了 .teamcity 扩展名。 Visual Studio 通过修剪扩展名从项目文件名中推断出$(ProjectName) 宏,因此您将$(ProjectName) 设置为mp3.vcxproj 而不仅仅是mp3。正如艾伦建议的那样,除了完全避免使用这个宏之外,我没有找到任何解决方法。

标签: msbuild teamcity


【解决方案1】:

我的二进制文件的文件名中出现 .vcxproj 时遇到了同样的问题。我将其缩小到 $(ProjectName) 变量在使用 TeamCity 构建时与在我自己的计算机上构建时不同。

我的解决方案是在每个受影响的项目文件中定义 ProjectName 变量(奇怪的是,在某些类型的项目中似乎没有发生,例如静态库)。

<!-- Define project name to avoid TeamCity from generating incorrect one -->
<PropertyGroup>
    <ProjectName>NAME_OF_PROJECT</ProjectName>
</PropertyGroup>

我把它放在 行下方和引用它的 定义上方。

我仍然不明白为什么 TeamCity 不同...我希望这可以帮助其他有同样问题的人。

【讨论】:

    【解决方案2】:

    这里有一个解决此问题的方法,不需要更改项目文件中的任何内容。在调用任何项目构建之前,将执行一个脚本,将所有感兴趣的.vcxproj 文件重命名为同名但没有.vcxproj 扩展名的文件。它是一个“命令行”运行器,脚本是

    for /r directory\with_projects %%%%f in (*.vcxproj) do rename %%%%f %%%%~nf
    

    然后“Visual Studio”运行器将重命名的项目文件作为参数。跑步者在内部制作一个带有.teamcity 扩展名的副本,然后由Visual Studio 修剪并给出正确的$(ProjectName) 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多