让 TFS 将每个项目输出到其自己的目录的最佳方法是什么?

2024-03-30

我正在将大型代码库放入 Team Foundation Server 中。我希望构建过程能够创建我们项目的“准备部署”版本。

我们执行此操作的正常方法是将每个项目的输出放在其自己的文件夹中。因此,例如,我们最终会得到类似的东西

C:\project1\
            assembly1.dll
            assembly2.dll
            project1.exe
            project1.exe.config
C:\project2\
            assembly2.dll
            assembly3.dll
            project2.exe
            project2.exe.config
C:\project3\
            assembly1.dll
            assembly3.dll
            project3.exe
            project3.exe.config

这就是我们喜欢的方式。

不过,TFS 似乎希望将所有内容都放在同一目录中。

C:\output\
          assembly1.dll
          assembly2.dll
          assembly3.dll
          project1.exe
          project1.exe.config
          project2.exe
          project2.exe.config
          project3.exe
          project3.exe.config

尽管它节省了一些磁盘空间(每个程序集仅存在一次),但这并不是我们想要的。

指定 TFS/MSBuild 应将输出文件放置在何处的最佳方法是什么?我是否需要单独编辑 sln/csproj 文件才能实现此目的,还是可以在 TFSBuild.proj 文件中执行此操作? (即在 MSBuild 特定的文件中)


我刚刚在这里写了另一种方法:

http://mikehadlow.blogspot.com/2009/06/tfs-build-publishedwebsites-for-exe-and.html http://mikehadlow.blogspot.com/2009/06/tfs-build-publishedwebsites-for-exe-and.html但如果您懒得点击链接,这里是完整的:

通常,最好的做法是在单个超级解决方案中收集团队控制下的所有代码,如模式​​和实践 PDF《使用 TFS 进行团队开发指南》中所述。如果您随后配置 TFS 构建服务器来构建此解决方案,则它的默认行为是将构建输出放入单个文件夹“Release”中。

解决方案中的任何 Web 应用程序项目也将输出到名为 _PublishedWebsites\ 的文件夹中。这非常好,因为这意味着您可以简单地通过 robocopy 部署 Web 应用程序。

不幸的是,其他项目类型(例如 WinForms、控制台或库)没有类似的默认行为。如果我们可以有一个 _PublishedApplications\ 子文件夹,其中包含任何选定项目的输出,那就太好了。幸运的是,这并不难做到。

_PublishedWebsites 的工作方式非常简单。如果您查看 Web 应用程序的项目文件,您会注意到底部附近有一个导入:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />

在我的计算机上,MSBuildExtensionsPath 属性的计算结果为 C:\Program Files\MSBuild,如果我们打开 Microsoft.WebApplication.targets 文件,我们可以看到它是一个非常简单的 MSBuild 文件,可以识别构建何时不是桌面构建,即它是一个TFS 构建,并将输出复制到:

$(OutDir)_PublishedWebsites\$(MSBuildProjectName)

我只是复制了 Micrsoft.WebApplication.targets 文件,使用项目文件中的相对路径将其置于源代码管理之下,并将 _PublishedWebsites 更改为 _PublishedApplications,并将文件重命名为 CI.exe.targets。对于我想要输出到 _PublishedApplications 的每个项目,我只需在项目文件的底部添加此导​​入:

<Import Project="<your relative path>\CI.exe.targets" />

您可以编辑 CI.exe.targets (或任何您想要的名称)来执行您的命令。就我而言,到目前为止唯一的更改是添加几行来复制 App.config 文件:

<Copy SourceFiles="$(OutDir)$(TargetFileName).config" DestinationFolder="$(WebProjectOutputDir)\bin" SkipUnchangedFiles="true" />

Microsoft.WebApplication.targets 中有很多内容仅与 Web 应用程序相关,可以针对其他项目类型进行删除,但我将其作为练习留给读者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让 TFS 将每个项目输出到其自己的目录的最佳方法是什么? 的相关文章

随机推荐

  • C#BackgroundWorker 的文化

    我想为我的整个应用程序设置文化 我尝试了以下操作 Thread CurrentThread CurrentCulture CultureInfo CreateSpecificCulture wantedCulture Thread Curr
  • 浏览器之间盒子模型的不同解释

    我注意到浏览器之间在宽度方面存在差异TH标签被解释 特别是宽度计算中是否包含填充 我正在构建一个可重用的库 用于快速生成表格和设计表格样式 当然 对于表格数据 这意味着我可以完全控制我生成的代码 但我需要实际解决问题而不是为特定实例寻找黑客
  • Qt 和 CMake 因重复符号而失败

    我的 c qt 项目中有 3 个文件 并且我正在使用 CMake 我正在尝试编译它这里有一些代码 CMakeLists 包含 cmake minimum required VERSION 3 8 project untitled set C
  • Apache Commons Lang 2 与 3

    在我的应用程序中 我使用 apache commons Lang v 3 所需的图书馆给我一个 java lang ClassNotFoundException org apache commons lang StringUtils com
  • 在 Rails 中添加与 simple_form、nested_form 和 Twitter Bootstrap 内联的控件

    我正在使用 simple form nested form 和 Twitter Bootstrap 并尝试将nested form 中的 删除链接 与对象放在同一行 现在看起来像这样 http grab by eKDS http grab
  • 安装适用于 Python 的 cx_Oracle

    在 Debian 5 上 我一直在尝试为 python 安装 cx oracle 模块 但没有成功 首先 我安装了 oracle xe client 及其依赖项 按照以下链接中的教程here http le gall net pierric
  • MSXML 哪个版本开始支持解析 XML 1.1?

    如果我使用 MSXML6 dll 解析 XML 1 1 我将收到此错误 0xC00CE57F MSG E INVALID VERSION 版本号无效 XML 1 1 最初发布于 2004 年 2 月 4 日 令我惊讶的是 MSXML6 dl
  • TDD 新手:是否有带有测试的示例应用程序来展示如何进行 TDD?

    我真的很想进入 TDD 开发 但我不知道从哪里开始 我认为 查看代码并了解他们如何编写测试并使类可测试 这样我会更容易消化并开始使用自己 有谁知道任何示例或小型开源C 包含单元测试的应用程序 对于沙卡尔佩什来说 我会推荐 ObjectMen
  • with() 语句从 opencv 中的 VideoCapture 读取?

    我喜欢使用 with 语句来访问文件和数据库连接 因为如果出现错误或文件关闭 它会自动为我断开连接 f open file txt r for i in f print i f close versus with open file txt
  • 在 bash 中读取以空格分隔的文件,不会导致空字段崩溃

    我正在尝试在 bash 中读取多行制表符分隔的文件 格式要求为空字段 不幸的是 外壳正在将彼此相邻的字段分隔符折叠在一起 如下所示 IFS t read one two three lt lt lt one t tthree printf
  • Fletchers16 校验和适合小数据吗?

    使用直接实施维基百科弗莱彻的校验和 https en wikipedia org wiki Fletcher s checksum对于 BCA 和 CAB 以及 BAC 和 ACB 等数据 我们得到相同的校验和 这是预期的吗 Fletche
  • 如何覆盖默认的 maven-install-plugin 行为?

    我需要自定义工件安装 并且无法弄清楚如何覆盖默认工件 来自默认的 Maven 生命周期 所以我的问题是 如何在我的 pom xml 中配置 Maven 安装插件 以便它不执行默认安装并仅执行我的自定义安装文件目标 我试过没有 id 和默认安
  • 为什么不同的 case 条件体不在不同的范围内?

    为什么不同的案件主体不会自动属于自己的范围 例如 如果我要这样做 switch condition case CONDITION ONE int account 27373 case CONDITION TWO account var no
  • 资源包 Spring

    如何在 Spring MVC 中的一个类中访问来自资源包的消息 该类扩展自AbstractController 我努力了getMessageSourceAccessor getMessage a message 但它会抛出这个异常 org
  • 如何从数据库值生成选择列表?

    我想知道在包含数据库中的值而不重复任何代码的表单上拥有选择列表的最佳方法是什么 我认为有意义的是将这些数据加载到控制器中并将其传递给视图模型 这样我就可以使用SelectListFor lt gt 或其他任何内容以生成列表 然而 这意味着我
  • 使用 ALS 训练时 Spark 给出 StackOverflowError

    当尝试在 Spark 的 MLLib 中使用 ALS 训练机器学习模型时 我不断收到 StackoverflowError 这是堆栈跟踪的一个小样本 Traceback most recent call last File Users us
  • 我们可以强制使用 Dart 垃圾收集器吗?

    我正在尝试模拟内存泄漏Streams 出于教育目的 但如果 GC 尚未运行 我无法确定内存是否真的泄漏 我可以在纯 Dart 测试中强制执行 GC 扫描吗 您可以通过 Dart DevTools Web GUI 来完成此操作 https d
  • 如何在android中创建液体布局

    我正在大学进行一个项目 我想知道如何在android中使用液体布局 以便不同的屏幕尺寸必须根据其分辨率看到应用程序 简而言之 我想创建一个应用程序 其布局在所有类型的屏幕上都是完美的 我知道如何在 PC 网站中用简单的 html css 创
  • Data.model.updateItem 不是函数 TypeError:Data.model.updateItem 不是函数

    使用 mongo 的 keystone js 中出现错误 Vehicle model updateItem 不是函数 TypeError Vehicle model updateItem 不是函数 目标是使用对象更新模型 就像我使用 ff
  • 让 TFS 将每个项目输出到其自己的目录的最佳方法是什么?

    我正在将大型代码库放入 Team Foundation Server 中 我希望构建过程能够创建我们项目的 准备部署 版本 我们执行此操作的正常方法是将每个项目的输出放在其自己的文件夹中 因此 例如 我们最终会得到类似的东西 C proje