未使用 MSBuild、Teamcity 复制 Bin 文件夹

2023-12-07

我有一个非常奇怪的问题,我创建了一个自定义 MSBuild 任务,它将 MVC 项目所需的所有文件移动到特定位置,以便我们可以发布它。当我在我的计算机上本地触发脚本时,这工作正常,但一旦我检查此更改并且 Teamcity 运行脚本,它就会复制除 Bin 文件夹之外的所有内容。 但是,如果直接从命令行运行 MSbuild(同一脚本),它会复制 bin 文件夹。我不明白为什么在 TeamCity 构建它时这不起作用。

有谁知道为什么会发生这种情况以及如何解决它?

<Target Name="AfterBuild">
   <CallTarget Targets="Move" />
</Target>
<Target Name="Move">
    <Copy SourceFiles="@(BinFolder)" DestinationFolder="$(ArtifactsDir)\Webproject.Web\bin" />
    <Copy SourceFiles="@(ContentFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Content" />
    <Copy SourceFiles="@(ImagesFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Images" />
    <Copy SourceFiles="@(ScriptsFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Scripts" />
</Target>


<ItemGroup>
   <BinFolder Exclude="*.cs" Include="$(ProjectDir)bin\**\*.*"/>
   <ContentFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Content\*.css"/>
   <ImagesFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Images\*.*"/>
   <ScriptsFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Scripts\*.js"/>
</ItemGroup>

$(ArtifactsDir) 是我从 Teamcity 传入并在命令行中手动传递的参数。

/p:ArtifactsDir="%system.agent.work.dir%\WebProject\trunk\Website"

我认为这是一个项目评估的问题。您的“BinFolder”项目在 MsBuild 第一次读取您的构建文件时(即构建之前)被解释。我认为 $(ProjectDir)bin***.* 在构建之前是空的。为了避免这种情况,您可以在目标中声明 bin 文件夹,如下所示:

<Target Name="AfterBuild">
   <CallTarget Targets="Move" />
</Target>
<Target Name="Move">

    <ItemGroup>
      <BinFolder Exclude="*.cs" Include="$(ProjectDir)bin\**\*.*"/>
    </ItemGroup>

    <Copy SourceFiles="@(BinFolder)" DestinationFolder="$(ArtifactsDir)\Webproject.Web\bin" />
    <Copy SourceFiles="@(ContentFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Content" />
    <Copy SourceFiles="@(ImagesFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Images" />
    <Copy SourceFiles="@(ScriptsFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Scripts" />
</Target>

<ItemGroup>
   <ContentFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Content\*.css"/>
   <ImagesFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Images\*.*"/>
   <ScriptsFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Scripts\*.js"/>
</ItemGroup>

或者您可以尝试使用 CreateItem 任务:

<Target Name="Move">

    <CreateItem Exclude="*.cs" Include="$(ProjectDir)bin\**\*.*">
      <Output TaskParameter="Include" ItemName="TheFiles"/>
    </CreateItem>

    <Copy SourceFiles="@(BinFolder)" DestinationFolder="$(ArtifactsDir)\Webproject.Web\bin" />
    <Copy SourceFiles="@(ContentFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Content" />
    <Copy SourceFiles="@(ImagesFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Images" />
    <Copy SourceFiles="@(ScriptsFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Scripts" />
</Target>

您可以在这里找到更多信息 :

  • MSBuild ItemGroup 包含/排除模式问题
  • http://blogs.msdn.com/b/msbuild/archive/2006/01/03/508629.aspx
  • http://www.sedodream.com/PermaLink,guid,dd6cb1db-c0e4-47f7-ad84-6e59ff6b03d0.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未使用 MSBuild、Teamcity 复制 Bin 文件夹 的相关文章

随机推荐

  • 如何使用 CSS 或 JavaScript 仅显示视频帧的一部分?

    我只想显示给定视频的部分视频帧 让我用例子来解释我的意思 我有一个宽屏视频 852 x 480 但我想通过使用 CSS 或 JavaScript 来模拟裁剪 将其显示为全屏视频 640 x 480 视频文件不变 该脚本只是隐藏侧面的像素 我
  • 编写 A 型框架的测试规范

    我对 VR 完全陌生 正在 AFrame 中为一个班级项目开发 VR 太空射击游戏 想知道 AFrame 中是否有 TDD 的任何文档 标准 有人能指出我正确的方向吗 几乎完全使用 A 框架组件构建您的应用程序 https aframe i
  • 如何在加载时保存图像的宽度和高度?

    我有一个数组 li 我试图将这些元素制作成轮播 只是我希望图像大小大于 640x480 时进行调整 并居中于框架中 我有以下代码 HTML ul li img src pic1 jpg p b 2012 b something p li l
  • iOS 设备未使用 GDAsyncUdpSocket 接收 UDP 多播

    下面的代码旨在接收 239 255 255 250 上的 UDP 多播消息 并简单地 NSLog 消息的内容 如果我将消息发送到 iOS 设备的 IP 即从终端echo foo nc u 10 1 10 249 1900 消息被接收并被 N
  • 反编译java类文件的最佳软件是什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 如何批量反编译多个class文件 JD Gui让你的生活变得轻松 它还有一个 eclipse 插件 编辑 更新了该工具的最新网址
  • info - 未处理的 socket.io url

    我正在开发一个 socket io node 项目 就像这个页面一样 http davidwalsh name websocket我在 socket io v7 中收到 信息 未处理的 socket io url 错误 但我在 v6 17
  • 将 C# 双精度格式转换为三的倍数次幂的科学记数法

    我正在尝试以科学格式格式化一些大数字 但我需要三的倍数的幂 有推荐的方法吗 我在表格中有一系列数字 而不是真正的科学格式 小数点前有一位数字 我很高兴进行这种更改以获得三的倍数的幂 例如 3 123e 00319 523e 003 而不是
  • 如何直接使用Pandas日期时间索引进行计算?

    我有以下有效的代码 table CALC DOM table index table CALC DOM table END DATE CALC DOM 难道不应该有更好的方法直接从 table index 转换吗 喜欢 table CALC
  • Unicode 文字导致语法无效

    下面的代码 s s replace u u amp 在 python 中导致错误 SyntaxError invalid syntax 删除u之前的 解决了问题 但这应该按原样工作吗 我正在使用Python 3 1 The uPython
  • 如何使用 Ant 运行 Nant 任务?

    我想做一些看起来可行的事情 但谷歌上的搜索并没有返回我需要的那么精确的东西 我们从之前一家本地化网站的公司继承了 Nant 脚本 他们工作得很好 我们有自己的 Ant 脚本来比较两个 SVN 存储库 然后合并它们 我们希望在 Ant 脚本运
  • 如何在 C#/IL 中改变装箱值类型(基元或结构)

    相关如何使用 IL 改变装箱结构我正在尝试以通用方式更改装箱值类型的值 因此尝试实现以下方法 void MutateValueType
  • Python virtualenv 无法通过 OneDrive 工作

    我的项目存储在 OneDrive 上 有时它可以在我的电脑和笔记本电脑上运行 两者都装有 Windows 10 两者上的项目位于同一目录中 C OneDrive code etc 当我使用 virtualenv 并下载不同的软件包时 它工作
  • 从数据网格获取复选框的值?

  • iOS7中如何绘制透明的UIToolbar或UINavigationBar

    我想要一个完全透明的UIToolbar and or UINavigationBar 我已经尝试了针对 iOS 5 之前和之后的各种建议 但似乎都不起作用了 在 iOS 7 中如何实现这一点 斯威夫特 3 iOS 10 透明的UIToolb
  • 将 bootstrap 列包装在额外的 div 中

    我正在使用 bootstrap v4 当我将列包装在额外的 div 中时 布局会被破坏 这是为什么 链接到代码笔http codepen io mariuszdaniel pen aJJjzJ Works div class contain
  • JavaScript 键码是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 JavaScript 有哪些可用的键码 如果所有浏览器的键码不相同 请列出每个浏览器的键码 键码是不同的从 ASCII 值 有关完整的 keyCod
  • 将 2d 向量初始化为类变量 C++

    我正在构建一个类 其中一个变量是二维向量 如何设置才能获得初始大小 我尝试了以下方法 但出现错误 在数字常量之前应有 或 另外 当我尝试将值设置为 pncode 的每一行时 我都会收到错误 数组下标的类型 int 无效 这是课程 ifnde
  • InvokeDynamic 参数的动态类型

    为了支持动态类型和方法分派 我的编程语言引入了一种称为dynamic 当调用类型为的被调用者的方法时dynamic 编译器首先将被调用者和所有参数压入堆栈 然后生成一个invokedynamic指令而不是正常的invoke 操作说明 该指令
  • Chrome 扩展程序:sendMessage 不起作用

    我已经读过几次 Google 关于 消息传递 的文档 并且可能查看了 10 多个具有相同问题的其他问题 并且已经尝试了他们的大多数 解决方案 和我下面的内容的一些变体 这就是黑魔法吧 不管怎样 就这样吧 清单文件 manifest vers
  • 未使用 MSBuild、Teamcity 复制 Bin 文件夹

    我有一个非常奇怪的问题 我创建了一个自定义 MSBuild 任务 它将 MVC 项目所需的所有文件移动到特定位置 以便我们可以发布它 当我在我的计算机上本地触发脚本时 这工作正常 但一旦我检查此更改并且 Teamcity 运行脚本 它就会复