首页 > 其他分享 >解决项目编译对SVN依赖的相关问题

解决项目编译对SVN依赖的相关问题

时间:2023-04-30 12:55:56浏览次数:50  
标签:SVN svn 依赖 Working 编译 源码 Copy

一、背景 软件打包发布并在机器部署后并生命周期没有结束,后续会随着使用发现各种各样的Bug,整个生命周期都与Bug为伴,发现Bug并解决Bug就是软件产品的一部分,通常软件出现异常会有日志记录,当问题出现后,如何知道一个软件库的版本,从而快速从源码库拉取对应版本的源码,调试并修复呢?这就需要记录下软件库的源码版本。 以.net程序为例,.net程序主要是有一系列的dll构成,为每一个dll标记源码库的版本号就很有必要,这将能指明dll对应源码的版本号,在实际使用中很有帮助。 .net程序集的版本号规则:主版本.次版本.生成号.修订号   希望每次发布的时候将修订号使用该项目对应的SVN版本号,假设项目的最初版本为1.0.0.0,当项目改动并提交到SVN后SVN版本号为100,则希望生成的dll中文件版本为:1.0.0.100,这样就能通过查看dll文件版本知道该dll对应的源码SVN版本号   二、通过SubWcRev.exe实现程序集信息包含SVN版本号 参考文档:https://tortoisesvn.net/docs/release/TortoiseSVN_zh_CN/tsvn-subwcrev.html   方案简要概述: (1)创建一个程序集模板文件:AssemblyInfo.tmpl (2)将该文件中的[assembly: AssemblyFileVersion("1.0.0.0")]改为[assembly: AssemblyFileVersion("1.0.0.$WCREV$")] (3)在预编译命令时执行SubWcRev.exe,将AssemblyInfo.tmpl模板文件生成AssemblyInfo.cs,步骤2中的程序集版本就会被自动替换为SVN最新版本号 以上最终实现编译后的dll文件版本包含SVN版本号   三、实际使用问题 But,实际使用中存在一些问题:SubWcRev.exe正确执行要求操作的目录必须为SVN Working Copy,否则无法编译通过,实际使用中有些机器并未预装SVN环境,结果就是编译报错。 显然,该方案源码编译是依赖于SVN环境的,是一种耦合问题   四、解决方案 那么,对于无SVN环境的机器,如何顺利编译通过? 1、方案一:为需要编译的项目源码提供SVN环境 在该机器安装VisualSVN Server Manager,将源码上传本地后再拉取副本,这样确保源码在新机器上是SVN Working Copy 虽然可行,但是这种方案比较繁琐,效率低下   问题根源在于SubWcRev.exe命令执行的源码目录是SVN Working Copy!!! 因此需要解决当源码目录不是SVN Woring Copy的情况下,依然能成功编译的问题,该问题的卡点在于如何判定指定源码目录是否为SVN Working Copy? 一旦能判断出指定源码目录不是 SVN Woring Copy,不执行SubWcRev.exe命令,就不会导致编译报错问题。   通过查阅资料,找到svn info命令可担此重任 : (1)当源码目录是SVN Working Copy,会打印出详细信息 (2)当源码目录不是SVN Working Copy,会提示错误信息:XXX is not working copy   创建一个解决方案,命名为SVNVersion,该解决方案包含两个项目:

  打开命令行,定位到上述源码目录,试验验证如下,执行成功:
E:\SvnVersion>svn info
Path: . Working Copy Root Path: E:\SvnVersion URL: https://xxx/svn/SvnVersion Relative URL: /SvnVersion Repository Root: https://xxx/svn/SvnVersion Repository UUID: ccdf0fd3-632d-c745-82a6-d8dcb4201352 Revision: 120 Node Kind: directory Schedule: normal Last Changed Author: xxx Last Changed Rev: 120 Last Changed Date: 2023-04-29 15:54:26 +0800

 

将.svn目录命名为.svn2,再次执行svn info,执行错误:
E:\SvnVersion>svn info
svn: E155007: 'E:\SvnVersion' is not a working copy
  以上试验说明svn info命令可以有效的检查一个指定目录是否为SVN Working Copy   如何判断svn info命令是否执行成功? CMD命令执行成功返回0,可以通过判断ERRORLEVEL变量是否等于0,来确定svn info 是否执行成功 至此,构思完成,解决了最初遇到的问题,优雅的解除了源码编译对SVN环境的依赖 最终给出解决方案:通过svn info 判断要编译的源码目录是否为SVN Working Copy,若是执行SubWcRev.exe,若不是则不执行,这样无论源码是否为SVN Working Copy都能正确编译   2、方案二:摆脱项目编译对SVN环境的依赖 具体实施步骤: (1)将SubWcRev.exe、SVN.exe文件拷贝到源码中,与解决方案文件(*.sln文件一个目录),这样可以确保没有SVN环境的机器同样可以执行SubWcRev、svn Info命令 (2)编写CMD代码:
cd /d $(SolutionDir)
svn info
if %ERRORLEVEL%==0 (
SubWcRev "$(ProjectDir)\" "$(ProjectDir)Properties\AssemblyInfo.tmpl" "$(ProjectDir)Properties\AssemblyInfo.cs"
) 
(3)将上述代码放到项目的生成前事件命令中,分别在源码是SVN Working Copy和不是SVN Working Copy两种场景中编译试验,均能通过测试,只是后一种情况编译的dll无SVN版本号 至此,已解决编译项目对SVN环境依赖问题,即便没有SVN环境,源码不是SVN Working Copy,依然能编译通过。    更近一步,对于实际项目中,通常有N多项目,每个项目都写这一段代码必然重复,违反了DRY原则,故重构上述代码,使之更整洁。 思路是将其提取到一个名为GenerateAssemblyInfo.bat文件中(与*.sln文件同一目录),将需要的目录作为变量传递:
set ProjectDir=%1
svn info
if %ERRORLEVEL%==0 (
SubWcRev %ProjectDir% %ProjectDir%Properties\AssemblyInfo.tmpl %ProjectDir%Properties\AssemblyInfo.cs
) 

 

项目属性中生成前事件命令行,改为调用bat文件:
cd /d $(SolutionDir)
call GenerateAssemblyInfo.bat $(ProjectDir)

 

 总结: (1)本文从实际需求出发,给出软件dll版本号与SVN版本号产生关联的方案:通过SubWcRev.exe实现 (2)在实际使用中上述方案存在编译依赖SVN环境的问题,导致无SVN环境的机器在编译项目时报错,无法编译通过 (3)通过分析问题症结,找出问题卡点在于能否有效判定源码目录是否为SVN Working Copy,并通过执行svn info命令给出判定依据 (4)综合需求及实际问题,给出优化方案,最终解决项目编译对SVN环境的依赖:当源码目录被检测出是SVN Working Copy时,执行SubWcRev.exe,否则不予执行 (5)通过重构批处理命令,提取到一个文件中,项目统一调用该文件,便于多个项目复用,保持了方案的整洁性  

标签:SVN,svn,依赖,Working,编译,源码,Copy
From: https://www.cnblogs.com/maomu/p/17364657.html

相关文章

  • 从源码编译并安装LXQT
    平台:ubuntu-22.04-server-amd64.对象:LXQT.文件:lxqt.LXQt是由LXDE-Qt和RazorQt合并的项目,它的目标是创建一个轻量级、模块化、运行快并且简单易用的桌面环境。本例中会介绍多种发行版下的编译方法,本例中使用Ubuntu22.04,你也可以使用其它发行版。1.安装编译环境CMake版本≥3.......
  • VS Code 配置 C/C++ 环境(编译/调试)
    1,VSCode安装点击此处跳转到官网下载安装VSCode2,环境准备这里我们安装VSCode官方推荐的方法安装即可。官方文档。2.1下载MSYS2点击进入MSYS2官网,找到Installation的Downloadtheinstaller:msys2-x86_64-20230318.exe,点击msys2-x86_64-20230318.exe下载。然后根......
  • 交叉编译
    1.将压缩包上传到虚机2.创建目录/usr/local/arm,并将压缩包解压到该目录mkdir/usr/local/armtar-jxvf-C/usr/local/arm/注意若解压不成功出现tar(child):bzip2:Cannotexec:Nosuchfileordirectory则需要下载bzip2命令:yum-yinstallbzip23.配置系统环境变量vi......
  • 修改postfix/手工编译/安装让smtp日志包含mail from 信息
    修改后的日志to=变成[email protected]>这是sent日志Nov2112:56:27chrd-edmpostfix/smtp[11762]:208E0100735:[email protected]><[email protected]>,relay=mx3.qq.com[112.90.138.89]:25,delay=0.94,delays=0.09/0.01/0.51/0.33,dsn=2.0.0,status=sent(250......
  • Xcode编译流程
     Xcode的构建过程本质上是执行一系列构建任务。如:代码检测,编译代码,链接目标文件,拷贝资源(图片,plist,nib)文件,代码签名等。大部分任务是执行命令行工具,如(clang编译、ld链接、codesign签名,altool上传)。这些工具使用xcode项目的配置信息,根据特定的顺序执行。bulidSystem的工......
  • Eclipse中如何修改SVN的地址
    Eclipse中如何修改SVN的地址在工作环境调整时,有的时候SVN服务器的地址需要修改,而正在开发中的项目在Eclipse中有些代码没有提交,此时怎么修改SVN的地址呢?以下有一个简单的办法:一、在Eclipse中选择Windows->ShowView->others就会出现如图:选中SVN资源库,会出现如下图所示的画面然后......
  • tinyMCE编译器样式更改
    最近用这个,发现固定高度后滚动条的样式还是浏览器自带的,跟现在后台的样式不一样就有点奇怪这是更改前的样式 这是后台全局滚动的样式 差别很大,就想着优化一下,然后就去看了文档,中文文档在这里,看到了一个配置,content_css然后在项目引入tinyMCE的地方新建文件写入想要更改......
  • Makefile 只修改了.h头文件,编译为什么不起作用?
    M,-MM,-MMD,-MF,-MT区别https://programmer.group/gcc-m-mm-mmd-mf-mt.htmlRef加-MMD选项解决头文件编译生效https://cloud.tencent.com/developer/article/1837814gcc预处理选项https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html......
  • Windows中qtcreator怎么将编译路径更改为当前目录?
       像VC那样,将执行文件所在debug或release目录,放置到源文件的当前目录是不错的选择。因为便于查找。   要实现这个将编译路径更改为当前目录功能,其实很简单,只需要在项目属性页的“构建目录”所在的编辑框中输入“./”即可。   此时,会在源文件的当前目录中产生......
  • 上篇:带你手工体验从写代码、编译、打包镜像、部署到K8S的全过程
    本篇使用的gowebdemo,页面很简单,功能也是很简单,写代码不是本篇的重点,重点是先体验一下整个流程:开发环境准备、写代码、提交到仓库、拉取代码构建并打包镜像、推送到镜像仓库,部署到K8S。本篇的分享分为上篇和下篇,上篇是手动,计划在下篇再讲自动。只有手动体验过,才能更能深入的理......