当前位置: 首页 > 编程日记 > 正文

使用CruiseControl.Net全面实现持续集成

持续集成想必大家很多人都听说过,甚至都实践过,最近我又一次亲历了一次持续集成,现将我的经验分享给大家。关于持续集成的理论在本文概不涉及,本文的主要目的是实战CruiseControl.Net,用它来全面实现持续集成。

在配置ccnet.config时会用到一些小工具,一并附上:小工具下载

首先,我们来看看用CC.Net能为我们做哪些事情:

自动获取源代码

自动Build

自动执行UnitTest,并生成单元测试报告

自动部署

触发自动化(回归)测试

邮件提醒

使用CCTray进行监控

应用plugin显示集成结果

设置集成策略

在开始之前,第一件事是配置我们的持续集成环境

获取SVN或TFS工具,TFS可通过安装VisualStudio获得,SVN可通过安装TortoiseSVN来获得。

安装和配置IIS,因为我们要使用Web页面查看持续集成的结果,所以需要配置IIS,安装CruiseControl.Net时会为我们创建一个名为ccnet的web应用程序。

从http://www.cruisecontrolnet.org/这个站点上现在我们需要的工具CruiseControl.Net并将其安装。

安装VisualStudio2013(当然也可选其它版本)。安装它的目的有两个,1. 使用了VSTest.Console.exe产生单元测试结果数据(UnitTest结果和测试覆盖率),2. 当编译不能通过时用它可以发现问题。

到此为止,集成环境已经OK,下面,我们来逐一来通过配置ccnet.config实现上述功能。

1.自动获取源代码

首先需要了解,持续集成的单位是以项目为单位,在ccnet.config文件里体现为Project,如下:

<project name="MyProject"description="demoproject showing a small config" queue="Q1"><!--内部配置-->
</project>
View Code

配置项目的源代地址,包括本地工作地址和源代码管理服务地址,对于使用TFS的源码管理器,向Project下添加如下配置:

<workingDirectory>E:\dailybuild</workingDirectory>
<artifactDirectory>E:\dailybuild</artifactDirectory>
<category>TestProject</category>
<sourcecontrol type="vsts" autoGetSource="true"  applyLabel="false"><server>http://tfs1.TestProject.com:8080</server><domain>TestProject.com</domain><project>$/TestProject projects/Analysis and Design\Concierge\Prototype</project><workingDirectory>E:\dailybuild\TestProject</workingDirectory><cleanCopy>true</cleanCopy>
</sourcecontrol>
View Code

对于使用svn源码管理器,可以使用以下配置:

<artifactDirectory>d:\svn\Log\MyProject</artifactDirectory>
<sourcecontrol type="svn"><executable>C:\Program Files\TortoiseSVN\bin\svn.exe</executable><username>UserName</username><password>******</password><autoGetSource>true</autoGetSource><trunkUrl>http://svnserver/trunk/MyProject</trunkUrl><workingDirectory>d:\svn\trunk\MyProject</workingDirectory>
</sourcecontrol>
View Code

2.实现自动Build,向Project节点下增加tasks节点,如下

<tasks><msbuild><executable>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</executable><buildArgs>/p:OutputPath=D:\BuildOutput</buildArgs><workingDirectory>D:\svn\branch\project\</workingDirectory><projectFile>mysolution.sln</projectFile><targets>Build</targets><timeout>9000</timeout></msbuild>
</tasks>
View Code

3.自动执行UnitTest,并生成单元测试报告

如果要生成单元测试报告和单元测试覆盖率,这里需要多下写功夫去配置。首先在创建Runsettings文件,如下:

CodeCoverage.runsettings的配置内容如下:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings><RunConfiguration><!-- Path relative to solution directory --><ResultsDirectory>d:\svn\log\TestResults</ResultsDirectory><!-- [x86] | x64  - You can also change it from menu Test, Test Settings, Default Processor Architecture --><TargetPlatform>x86</TargetPlatform><!-- Framework35 | [Framework40] | Framework45 --><TargetFrameworkVersion>Framework40</TargetFrameworkVersion></RunConfiguration><DataCollectionRunSettings><DataCollectors><DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"><Configuration><CodeCoverage><!-- Match assembly file paths: --><ModulePaths><Include><ModulePath>.*\.dll$</ModulePath><ModulePath>.*\.exe$</ModulePath></Include><Exclude><ModulePath>.*CPPUnitTestFramework.*</ModulePath></Exclude></ModulePaths><!-- Match fully qualified names of functions: --><!-- (Use "\." to delimit namespaces in C# or Visual Basic, "::" in C++.)  --><Functions><Exclude><Function>^Fabrikam\.UnitTest\..*</Function><Function>^std::.*</Function><Function>^ATL::.*</Function><Function>.*::__GetTestMethodInfo.*</Function><Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function><Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function></Exclude></Functions><!-- Match attributes on any code element: --><Attributes><Exclude><!-- Don’t forget "Attribute" at the end of the name --><Attribute>^System.Diagnostics.DebuggerHiddenAttribute$</Attribute><Attribute>^System.Diagnostics.DebuggerNonUserCodeAttribute$</Attribute><Attribute>^System.Runtime.CompilerServices.CompilerGeneratedAttribute$</Attribute><Attribute>^System.CodeDom.Compiler.GeneratedCodeAttribute$</Attribute><Attribute>^System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute$</Attribute></Exclude></Attributes><!-- Match the path of the source files in which each method is defined: --><Sources><Exclude><Source>.*\\atlmfc\\.*</Source><Source>.*\\vctools\\.*</Source><Source>.*\\public\\sdk\\.*</Source><Source>.*\\microsoft sdks\\.*</Source><Source>.*\\vc\\include\\.*</Source></Exclude></Sources><!-- Match the company name property in the assembly: --><CompanyNames><Exclude><CompanyName>.*microsoft.*</CompanyName></Exclude></CompanyNames><!-- Match the public key token of a signed assembly: --><PublicKeyTokens><!-- Exclude Visual Studio extensions: --><Exclude><PublicKeyToken>^B77A5C561934E089$</PublicKeyToken><PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken><PublicKeyToken>^31BF3856AD364E35$</PublicKeyToken><PublicKeyToken>^89845DCD8080CC91$</PublicKeyToken><PublicKeyToken>^71E9BCE111E9429C$</PublicKeyToken><PublicKeyToken>^8F50407C4E9E73B6$</PublicKeyToken><PublicKeyToken>^E361AF139669C375$</PublicKeyToken></Exclude></PublicKeyTokens><!-- We recommend you do not change the following values: --><UseVerifiableInstrumentation>True</UseVerifiableInstrumentation><AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses><CollectFromChildProcesses>True</CollectFromChildProcesses><CollectAspDotNet>False</CollectAspDotNet></CodeCoverage></Configuration></DataCollector></DataCollectors></DataCollectionRunSettings>
</RunSettings>
View Code

里面最重要的信息室配置了单元测试结果存放路径:<ResultsDirectory>d:\svn\log\TestResults</ResultsDirectory>,以便我们后来生成测试结果。

接着来配置ccnet.config,以执行单元测试

<!--删除上次单元测试结果-->
<exec><executable>D:\svn\tool\delfile.bat</executable><buildArgs>D:\svn\Log\TestResultsReal\mstest-results.trx</buildArgs><buildTimeoutSeconds>300</buildTimeoutSeconds><successExitCodes>-1,0</successExitCodes>
</exec>
<exec><executable>D:\svn\tool\delfile.bat</executable><buildArgs>D:\svn\Log\TestResultsReal\mstest-coverage.xml</buildArgs><buildTimeoutSeconds>300</buildTimeoutSeconds><successExitCodes>-1,0</successExitCodes>
</exec>
<!--执行单元测试-->
<exec><executable>C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\VSTest.Console.exe</executable><baseDirectory>D:\svn\UnitTest.dll所在的文件目录</baseDirectory><buildArgs>UnitTest.dll /Enablecodecoverage /Settings:D:\svn\tool\CodeCoverage.runsettings /logger:trx</buildArgs><buildTimeoutSeconds>300</buildTimeoutSeconds>
</exec>
<!--生成测试覆盖率-->
<exec><executable><!--删除上次单元测试结果--><exec><executable>D:\svn\tool\delfile.bat</executable><buildArgs>D:\svn\Log\TestResultsReal\mstest-results.trx</buildArgs><buildTimeoutSeconds>300</buildTimeoutSeconds><successExitCodes>-1,0</successExitCodes></exec><exec><executable>D:\svn\tool\delfile.bat</executable><buildArgs>D:\svn\Log\TestResultsReal\mstest-coverage.xml</buildArgs><buildTimeoutSeconds>300</buildTimeoutSeconds><successExitCodes>-1,0</successExitCodes></exec><!--执行单元测试--><exec><executable>C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\VSTest.Console.exe</executable><baseDirectory>D:\svn\UnitTest.dll所在的文件目录</baseDirectory><buildArgs>UnitTest.dll /Enablecodecoverage /Settings:D:\svn\tool\CodeCoverage.runsettings /logger:trx</buildArgs><buildTimeoutSeconds>300</buildTimeoutSeconds></exec><!--生成测试覆盖率--><exec><executable>D:\svn\tool\coverage\Auto.Dealer.UnitTest.Tool.exe</executable><buildArgs>D:\svn\log\TestResults\ D:\svn\log\TestResultsReal\mstest-results.trx D:\svn\log\TestResultsReal\mstest-coverage.xml</buildArgs><buildTimeoutSeconds>300</buildTimeoutSeconds><successExitCodes>-1,0</successExitCodes></exec><!--合并xml文件--><merge><files><file>D:\svn\Log\TestResultsReal\mstest-results.trx</file><!--这个文件是用于合并UnitTest result--></files></merge><merge><files><file>D:\svn\Log\TestResultsReal\mstest-coverage.xml</file><!--这个文件是用于合并UnitTest result--></files></merge>D:\svn\tool\coverage\Auto.Dealer.UnitTest.Tool.exe</executable><buildArgs>D:\svn\log\TestResults\ D:\svn\log\TestResultsReal\mstest-results.trx D:\svn\log\TestResultsReal\mstest-coverage.xml</buildArgs><buildTimeoutSeconds>300</buildTimeoutSeconds><successExitCodes>-1,0</successExitCodes>
</exec><!--合并xml文件-->
<merge><files><file>D:\svn\Log\TestResultsReal\mstest-results.trx</file><!--这个文件是用于合并UnitTest result--></files>
</merge>
<merge><files><file>D:\svn\Log\TestResultsReal\mstest-coverage.xml</file><!--这个文件是用于合并UnitTest result--></files>
</merge>
View Code

这里,想必大家已经注意到有两处删除操作,因为持续集成式一个不断重复的过程,如果不删除原来的测试结果就会发生错误。另外,用到的一个工具(这个工具里的代码很简单,一并提供出来如下),用来将trx文件转化为xml文件,即单元测试覆盖率结果。最后将它们一起合并到CruiseControl的执行日志里。

生成单元测试覆盖率代码如下:

    class Program{static void Main(string[] args){string dirName = args[0];string trxUutPutFileName = args[1];string coverageoutPutFileName = args[2];if (Directory.Exists(dirName)){DirectoryInfo dirc = new DirectoryInfo(dirName);foreach (FileInfo file in dirc.GetFiles("*.trx")){file.CopyTo(trxUutPutFileName, true);break;}foreach (FileInfo file in dirc.GetFiles("*.coverage", SearchOption.AllDirectories)){ConvertToXML(file.FullName, coverageoutPutFileName);break;}dirc.Delete(true);}else{Console.WriteLine("没找到目录:"+dirName);}}public static void ConvertToXML(string coverageFile, string outputFile){using( CoverageInfo coverageInfo = CoverageInfo.CreateFromFile(coverageFile)){using (CoverageDS ds = coverageInfo.BuildDataSet()){ds.ExportXml(outputFile);}}}}
View Code

4.自动部署

<!--发布到站点-->
<buildpublisher><sourceDir>d:\svn\_PublishedWebsites\MyWeb</sourceDir><publishDir>\\IP地址\website\</publishDir><useLabelSubDirectory>false</useLabelSubDirectory>
</buildpublisher>
View Code

5. 触发自动化(回归)测试

如果有自动化测试框架,则可以考虑部署完毕后自动触发执行自动化测试,由于自动化测试框架可能会有很大差异,这里就不在给出配置,总的来说,使用<exec></exec>可以很灵活地实现我们的需求。

6. 邮件提醒功能

无论持续集成执行成功,还是失败,都可以配置相应的邮件接收人员。邮件配置要放到<publishers></publishers>。这样,邮件发送的失败就不会阻塞持续集成。

<publishers><email mailport="25" includeDetails="TRUE" mailhostUsername="my@sina.com" mailhostPassword="******" useSSL="FALSE"><from>my@sina.com</from><mailhost>smtp.sina.net</mailhost><users><user name="张三" group="developers" address="123@sina.com" /><user name="李四" group="developers" address="456@sina.com" /><user name="王五" group="developers" address="789@sina.com" /></users><groups><group name="developers"><notifications><notificationType>Failed</notificationType><notificationType>Fixed</notificationType></notifications></group><group name="buildmaster"><notifications><notificationType>Always</notificationType></notifications></group></groups><converters><regexConverter find="$" replace="@sina.com" /></converters><modifierNotificationTypes><NotificationType>Failed</NotificationType><NotificationType>Fixed</NotificationType></modifierNotificationTypes><subjectSettings><subject buildResult="StillBroken" value="Build is still broken for {CCNetProject}" /></subjectSettings></email><statistics /><xmllogger />
</publishers>
View Code

7. 使用CCTray监控持续集成

打开http://CruiseControl所在机的IP/ccnet/,可以看到如下连接,下载并安装。就可以监控制定的项目了。

8.应用plugin显示集成结果

最后,做了以上所有的事情以后,在http://CruiseControl所在机的IP/ccnet/这个站点上并不能看到我们所有的持续集成结构,CruiseControl为我们提供了一些Plugins,即一些xsl文件,使用它们就可以显示我们想要的结果了。这些xsl文件的地址为:CruiseControl的安装路径\CruiseControl.NET\webdashboard\xsl。我们需要修改一下dashboard.config这个文件,我向其中添加了如下内容:

<buildPlugins><buildReportBuildPlugin><xslFileNames><xslFile>xsl\header.xsl</xslFile><xslFile>xsl\modifications.xsl</xslFile><xslFile>xsl\unittests.xsl</xslFile><xslFile>xsl\MsTestSummary2008.xsl</xslFile><xslFile>xsl\compile-msbuild.xsl</xslFile><xslFile>xsl\SimianSummary.xsl</xslFile><xslFile>xsl\MsTestSummary2010.xsl</xslFile><xslFile>xsl\MsTestSummary.xsl</xslFile><xslFile>xsl\MsTestReport2010.xsl</xslFile><xslFile>xsl\MsTestCover2010.xsl</xslFile></xslFileNames></buildReportBuildPlugin>
</buildPlugins>
View Code

这样,重启ccnet站点后,我们的测试结果也会被格式化地显示出来。

9.设置集成策略

以每日构建为例,需要在<triggers></triggers>里配置如下结果:

<scheduleTrigger time="23:30" buildCondition="ForceBuild" name="Scheduled"><weekDays><weekDay>Monday</weekDay><weekDay>Tuesday</weekDay><weekDay>Wednesday</weekDay><weekDay>Thursday</weekDay><weekDay>Friday</weekDay></weekDays>
</scheduleTrigger>
View Code

 

至此,我们的持续集成也基本上可以告一段落了。可以使用它来进行一些自动化的工作了。

转载于:https://www.cnblogs.com/wangjq/p/3977318.html

相关文章:

Blender三维建模和动画风格化的东方场景视频教程

Blender三维建模和动画风格化的东方场景-Blender 3D Modelling & Animating A Stylized Oriental Scene Blender三维建模和动画风格化的东方场景-Blender 3D Modelling & Animating A Stylized Oriental Scene 时长:23h 40m | .MP4 1280720&#xff0c;30 fps(r) | A…

一条直线上N个线段所覆盖的总长度

转自http://blog.csdn.net/bxyill/article/details/8962832 问题描述&#xff1a; 现有一直线&#xff0c;从原点到无穷大。 这条直线上有N个线段。线段可能相交。 问&#xff0c;N个线段总共覆盖了多长&#xff1f;(重复覆盖的地区只计算一次) 解题思路&#xff1a; 可以将每…

html根据字段制作曲线图,canvas制作简单的HTML图表,折线或者矩形统计(原创)

插件描述&#xff1a;canvas制作简单的HTML图表&#xff0c;折线或者矩形统计 使用canvas制作简单的HTML图表&#xff0c;折线或者矩形统计。使用canvas制作简单的HTML图表&#xff0c;折线或者矩形统计&#xff0c;简单而实用。图形由 Ctable类创建&#xff0c;类我已经写好了…

联合索引最左匹配原则成因

使用col3,col2,col1 顺序建立联合索引&#xff0c;通过col3的值建立一个btree &#xff0c;通过关键值去查找“Alice”&#xff0c;在叶子节点中找到两个“Alice”,那么“Alice”对于col2、col1对应的值&#xff0c;那么会对col2&#xff0c;col1分别进行一个有序的排列&#x…

二 IOC之PropertyPlaceholderConfigurer

2019独角兽企业重金招聘Python工程师标准>>> 老长一段时间没有看文档了&#xff0c;今天看到这个PropertyPlaceholderConfigurer有点意思&#xff0c;我于百忙之中抽出点时间&#xff0c;将这个点记录在这里&#xff0c;方便日后慢慢完善&#xff0c;慢慢深入。 因为…

关于Linux服务器磁盘空间占满问题的解决方法

下面给大家分享一篇关于Linux服务器磁盘占满问题解决方法&#xff08;/dev/sda3 满了&#xff09;&#xff0c;需要的的朋友参考下吧下面我们一起来看一篇关于Linux服务器磁盘占满问题解决&#xff08;/dev/sda3 满了&#xff09;&#xff0c;希望碰到此类问题的人能带来帮助。…

Maya人物角色行走动画制作视频教程

Maya人物角色行走动画制作视频教程 Maya人物角色行走动画制作视频教程 持续时间2h 57m 包含项目文件 1920X1080 MP4 大小解压后&#xff1a;2.27G 标题:技能分享–在Maya制作专业行走动画 云桥网络 平台 huo取 教程 信息: 这门课程是为初学者设计的&#xff0c;他们理解工作…

细数技术指标-[转载]

技术指标类别庞杂&#xff0c;要一一学全&#xff0c;基本不可能&#xff0c;也没有这个必要。我们只要掌握几个常用的指标&#xff0c;了解它们的原理&#xff0c;从而举一反三&#xff0c;就足够了。其实任何一种技术指标都是从形态、价格、量、时间这四项出发的&#xff0c;…

html无序列表的滚动效果,html无序列表标签和有序列表标签使用示例

原标题&#xff1a;html无序列表标签和有序列表标签使用示例一、上下层列表标签:&#xff1a;上层dt下层dd&#xff1a;封装的内容会被自动缩进的效果复制代码代码如下:运动户外板鞋篮球鞋足球鞋跑步鞋二、定义有序列表: 属性&#xff1a;type&#xff1a; 可以设置排序的样式 …

2022-2028年中国微藻行业市场调查研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国微藻行业市场行业相关概述、中国微藻行业市场行业运行环境、分析了中国微藻行业市场行业的…

cocos2dx 优化略记

缓存cache: 预加载资源到内存, 可以异步加载. 直接使用sprite:create()来加载资源的话, 有时候会发现, 在第一次运行动作的时候会变的很卡. 那是因为第一次要加载资源到内存, 加载资源到内存这个过程会比较的慢. 资源较大的话, 明显的会感觉到卡帧 批次渲染: 100个相同的…

关于AD编程的一些资料

有人问我怎样在.NET下操作AD对象&#xff0c;找了些资料和Sample&#xff0c;留作备用。 .NET Framework Class Library: System.DirectoryServices Namespace http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemdirectoryservices.asp How to poll for changes …

Blender和Substance Painter制作科幻装甲视频教程

Blender和Substance Painter制作科幻装甲视频教程 时长7小时 1280X720 MP4 题目&#xff1a;《技能共享》--用Blender和Substance Painter绘制科幻盔甲 流派:电子学习| MP4 |视频:h264&#xff0c;1280x720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&…

Linux wait() 和 waitpid()函数介绍

转载自http://blog.csdn.net/wallwind/article/details/6998602 当一个进程正常或异常终止的时候&#xff0c;内核就像其父进程发送SIGCHLD信号&#xff0c;因为子进程是个一步事件&#xff0c;所以这种信号也是内核系那个父进程发的异步通知。父进程可以选择忽略该信号&#x…

jq修改iframe html代码,jQuery控制iFrame(实例代码)

用jquery在IFRAME里取得父窗口的某个元素的值只好用DOM方法与jquery方法结合的方式实现了1.在父窗口中操作 选中IFRAME中的所有单选钮$(window.frames["iframe1"].document).find(”input[typeradio]“).attr(”checked”,”true”);2.在IFRAME中操作 选中父窗口中的…

索引是建的越多越好吗?

索引是建的越多越好吗&#xff1f; 明显不是&#xff0c;有以下几点&#xff1a; 数据量小的表不需要建立索引&#xff0c;建立会增加额外的索引开销不经常引用的列不要建立索引&#xff0c;因为不常用&#xff0c;即使建立了索引也没有多大意义。对经常用于查询的字段应该创…

TFS数据迁移之sync_by_blk

本文档记录了两套tfs 2.2.16系统之间的数据迁移过程。Source环境介绍&#xff1a;Tfs 主nameserver: 192.168.1.225/24 (vip 229)Tfs 从nameserver: 192.168.1.226/24 Tfs data server 1: 192.168.1.226/24 &#xff08;启动三个挂载点,每个挂载点分配20G空间&#xff09;Tfs …

阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_5_final关键字用于修饰成员变量...

直接这么修饰成员变量就会报错。这里必须要手动赋值&#xff0c;因为string name这里的默认是值null。一但默认值以后就不能后续再赋值了。所以这里强制你必须要手动赋值。 给name赋值后。后面所有的代码 尝试给name赋值的地方都报错了。 通过构造进行赋值。 构造有两个一个有参…

Blender 和Unreal Engine中的模块化3D建筑技能学习视频教程

Blender 和Unreal Engine中的模块化3D建筑技能学习视频教程 流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕翻译更准确&#xff09; |大小解压后:3.17 GB |时长:5h 42m 用Blen…

$().html()对ie9无效,不注意这点,\9和\0就可能对hack IE11\IE9\IE8无效

每次设计一张网页或一个表单&#xff0c;都被各种浏览器的兼容问题伤透脑筋&#xff0c;尤其是IE家族。在做兼容性设计时&#xff0c;我们往往会使用各种浏览器能识别的独特语法进行hack&#xff0c;从而达到各种浏览器下显示正常的目的。其中&#xff0c;我们用得最多莫属于\9…

MPC8313ERDB不新鲜pkg包裹,把文件放进Ramdisk

MPC8313ERDB不新鲜pkg包裹&#xff0c;把文件放进Ramdisk 经ltib编译器生成rootfs.ext2.gz.uboot它可以直接uboot采用。假设我们编写了相应的外部文件把Ramdisk往里走。您可以创建一个pkg包裹。然后配置编译&#xff08;&#xff0c;。&#xff0c;&#xff09;。当然这样的方法…

2022-2028年中国微型汽车市场投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国微型汽车行业市场行业相关概述、中国微型汽车行业市场行业运行环境、分析了中国微型汽车行…

[Python]小百合十大爬虫

国庆几天在家看了几篇关于使用Python来编写网络爬虫的博客&#xff0c;想来自己断断续续学习Python也有几个月了&#xff0c;但一个像样的程序都没有写过&#xff0c;编程能力并没有得到提高&#xff0c;愧对自己花费的时间。很多时候虽然知道什么事情是对的&#xff0c;但自身…

Web自动化测试 六 ----- selector选择

1、一般情况下都是先定位元素在选择 from selenium.webdriver import Chrome from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as ECdriver Chrome()dr…

AI矢量绘图软件技能学习视频教程

AI矢量绘图软件技能学习视频教程 技能分享——Adobe Illustrator CC——精粹大师班 云桥网络 平台 获取 教程 时长:5h 42m |视频:。MKV 1280720&#xff0c;30 fps(r) |音频:AAC&#xff0c;44100 Hz&#xff0c;2ch |大小解压后:2.27 GB 语言&#xff1a;英语中英文字幕&am…

利用JS判断是手机端还是PC端 浏览网站

引入百度JS&#xff1a; <script src"http://siteapp.baidu.com/static/webappservice/uaredirect.js" type"text/javascript"></script> <script type"text/javascript">uaredirect("这里写跳转手机端网页地址");&…

职校中的计算机学的是什么,职校计算机专业主要学什么课

职校计算机专业主要学什么课2020-11-19 15:37:41文/樊越很多同学都知道计算机是近几年的大热门课程&#xff0c;小编整理了一些计算机专业的课程&#xff0c;大家一起来看看吧。计算机专业课程学习计算机的基本原理、基本结构、基本算法、基本设计等。主课程&#xff1a;计算机…

浅谈MySQL存储引擎-InnoDBMyISAM

浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层&#xff0c;负责MySQL中的数据的存储和提取。MySQL存储引擎有很多&#xff0c;不同的存储引擎保存数据和索引的方式是不同的。每一种存储引擎都有它的优势和劣势&#xff0c;本文只讨论最常见的In…

android ValueAnimator学习

2019独角兽企业重金招聘Python工程师标准>>> 一、简介 This class provides a simple timing engine for running animations which calculate animated values and set them on target objects. There is a single timing pulse that all animations use. It runs …

Annotation

在进行类或方法定义的时候&#xff0c;都可以使用一系列的Annotation&#xff08;public interface Annotation&#xff09;进行声明&#xff0c;如果想要获取这些Annotation的信息&#xff0c;可以直接通过反射来完成。在 java.lang.reflect 里面有一个AccessibleObject类&…