由于面向接口编程的关系,许多实现往往是动态注入运行,在一个项目中直接引用实现dll编译是不合理的。通常我们会在Post Build Event中添加一些xcopy命令将运行时才需要的dll复制到输出目录。在发布时会带来一些问题,比如:使用Visual Studio自带的Publish功能发布一个Web应用时就不会运行Post Build Event。同样的在基于TFS Build时也存在类似问题。

TFS Build时会根据对应Definition的名称创建两个子目录:Source、Binaries,Binaries下针对Web应用会创建发布目录"_PublishedWebsites",如果想要Post Build Event时将dll复制到对应目录下,最简单的方式就是再添加xcopy命令(这样的命令可能有多条),例如:

xcopy /y /i "$(SolutionDir)BuildEvents\Post-build" "$(TargetDir)_PublishedWebsites\$(TargetName)\bin\"

但是会给开发人员带来歧义、工作量并污染Post Build Event。其实我们想做的就是当MSBuild时的某一个参数值符合要求则执行发布用的命令(这个命令和Post Build Event执行的内容一样,就是$(TargetDir)不同),这时就需要修改项目文件来添加一些自定义的脚本实现该功能。首先在Build Definition的高级选项里添加MSBuild Arguments,例如:

/p:RMS=

由于我的目标是和Release Management Service整合,故使用了该缩写。下面打开项目文件(csproj),开启AfterBuild,并添加一个Exec Task

<Target Name="AfterBuild">
<Exec Command="$(PostBuildEvent)" Condition=" '$(RMS)' == '1' " />
</Target>

上面的命令实际无法达到最终效果,这里自己绕了一个弯路。主要问题在于对PostBuildEvent的理解,其实它也是一个字符串变量,在执行时它内部使用的$(TargetDir)早已被替换,无法再重新计算结果。例如:

<Target Name="AfterBuild" Condition=" '$(RMS)' == '1' ">
<PropertyGroup>
<TargetDir>$(TargetDir)_PublishedWebsites\$(TargetName)\bin\</TargetDir>
</PropertyGroup>
<Message Text="$(TargetDir)" />
<Exec Command="$(PostBuildEvent)" />
</Target>

TargetDir的值确实产生变化,但PostBuildEvent的值也已经被提前计算,我们无法再让它被动态计算一次。幸好MSBuild 4.0以上版本允许我们使用一部分.NET代码来修改这些变量,我们只需调用System.String的Replace方法即可,参考如下:

<Target Name="AfterBuild">
<Exec Command="$(PostBuildEvent.Replace(&quot;$(TargetDir)&quot;, &quot;$(TargetDir)_PublishedWebsites\$(TargetName)\bin\&quot;))" Condition=" '$(RMS)' == '1' " />
</Target>

通过上面的方法就可以将Web应用完整发布,并结合Release Management Service实现持续集成。

TFS Build做Web应用持续集成发布的一个技巧的更多相关文章

  1. docker+headless+robotframework+jenkins实现web自动化持续集成

    在Docker环境使headless实现web自动化持续集成 一.制作镜像 原则:自动化测试基于基础制作镜像 命令:docker run --privileged --name=$1 --net=ho ...

  2. Web API 持续集成:PostMan+Newman+Jenkins(图文讲解)

    本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上篇文章我们已经完成了API测试工具选型,接下来是一系列周期性的开发 ...

  3. postman+jenkins+newman做接口测试的持续集成

    为何要做接口自动化测试的持续集成? 1. 接口相对稳定,改动少,比起GUI自动化测试来说性价比更加高些,不容易出现GUI自动化那种掉到维护脚本的坑里. 2. 接口测试比较简单,一个规范的接口,测试只需 ...

  4. (转)Jenkins2.0 Pipeline 插件执行持续集成发布流程 - git -资料 - 不错的文档

    1.Jenkins 2.0 的精髓是 Pipeline as Code Jenkins 2.0 的精髓是 Pipeline as Code,是帮助 Jenkins 实现 CI 到 CD 转变的重要角色 ...

  5. Jenkins+SVN+tomcat持续集成发布

    有代码更新后重新打包到tomcat再发布,是不是很烦? 看了下面的东西你就不会烦了. SVN或者git等代码版本控制工具不说了,如果是本地开发,也可以安装一个svn server端 jenkins下载 ...

  6. jenkins(8): 实战jenkins+gitlab持续集成发布php项目(代码不需要编译)

    一. jenkins 的配置 1.前提条件安装了GitLab Plugin (源码管理使用),GitLab Hook(gitlab webhook需要) Manage Jenkins--->Ma ...

  7. Docker学习笔记五:Docker生成jenkins容器,支持Java Web项目持续集成、持续部署

    一.创建jenkins容器: 1.拉取jeknin镜像 sudo docker pull jenkins 2.创建一个jenkins目录 sudo mkdir /jenkins 3.在jenkins目 ...

  8. 在TFS持续集成(持续发布)中执行Telnet任务

    Telnet是一种在因特网或局域网上使用虚拟终端连接,提供双向交互式文本通信设备的协议. 它是最早的互联网通讯协议之一.自1969年启用以来,已经经过了将近50年时间,在开放式的操作系统中拥有广泛的用 ...

  9. (转载)持续集成(第二版)[来自:Martin Fowler]

    转载自:iTech的博客 持续集成(第二版) 作者:Martin Fowler 译者:雷镇 持续集成 是一种软件开发实践.在持续集成中,团队成员频繁集成他们的工作成果,一般每人每天至少集成一次,也可以 ...

随机推荐

  1. textarea标签内容为(英文或数字不自动换行)的解决方法

    textarea 显示一串英文时不会发生换行. 以下是两种解决方法:1.限制textarea的大小 width 设置为 00px (不要设置为00%)cols  设置为 30+ (也有类似效果) 2. ...

  2. win上的某个端口是否开启

    1.添加Telnet服务 控制面板-->程序-->打开或关闭windows功能 2.配置Telnet为自动并开启服务 计算机-->服务和应用程序-->服务 3.telnet - ...

  3. OpenGL中的光照技术(翻译)

    Lighting:https://www.evl.uic.edu/julian/cs488/2005-11-03/index.html 光照 OpenGL中的光照(Linghting)是很重要的,为什 ...

  4. 使用d3.v3插件绘制出svg图

    众所周知,这个插件使用的svg技术,而IE8(包括IE8)之前的浏览器是不支持svg的 接下来看代码吧 从后台获取到带id和父id的目录数据[json格式] var module = requestU ...

  5. ns-3 的下载、编译以及 Eclipse 的相关配置

    0. 写在前面 对于初次接触Linux系统的人来说,ns-3 的安装似乎并不友好.但其实仅仅要按部就班地来做,其安装过程也没有看上去的那么复杂.本文将官方 Wiki 中的安装过程稍作梳理,希望能为刚開 ...

  6. mysql的联表删除

    联表删除: 1.从数据表t1 中把那些id值在数据表t2 里有匹配的记录全删除掉 DELETE t1 FROM t1,t2 WHERE t1.id=t2.id    或DELETE  FROM t1 ...

  7. RF--执行案例时动态传入参数方法

    通过在运行界面的设定-v 参数值来动态传入:

  8. Linux 查看目录大小及文件数量命令

    查看当前目录大小: [root@21andy.com]# du -sh 查看指定目录大小: [root@21andy.com]# du -sh /www/21andy.com 查看当前目录文件总数: ...

  9. Django SimpleCMDB 项目

    创建 SimpleCMDB 项目: [root@localhost ~]$ django-admin.py startproject SimpleCMDB 创建应用,收集主机信息: [root@loc ...

  10. Nginx 解析PHP

    配置如下: [root@localhost ~]$ cat /usr/local/nginx/conf/vhost/test.com.conf server { listen 80; server_n ...