导航:首页 > 源码编译 > 父模块和子模块编译顺序

父模块和子模块编译顺序

发布时间:2022-04-21 19:02:18

① git使用子模块有什么好处

经常有这样的事情,当你在一个项目上工作时,你需要在其中使用另外一个项目。也许它是一个第三方开发的库或者是你独立开发和并在多个父项目中使用的。这个场景下一个常见的问题产生了:你想将两个项目单独处理但是又需要在其中一个中使用另外一个。

这里有一个例子。假设你在开发一个网站,为之创建Atom源。你不想编写一个自己的Atom生成代码,而是决定使用一个库。你可能不得不像CPAN install或者Ruby gem一样包含来自共享库的代码,或者将代码拷贝到你的项目树中。如果采用包含库的办法,那么不管用什么办法都很难去定制这个库,部署它就更加困难了,因为你必须确保每个客户都拥有那个库。把代码包含到你自己的项目中带来的问题是,当上游被修改时,任何你进行的定制化的修改都很难归并。

Git 通过子模块处理这个问题。子模块允许你将一个 Git 仓库当作另外一个Git仓库的子目录。这允许你克隆另外一个仓库到你的项目中并且保持你的提交相对独立。

android工程编译顺序是怎么样的先编译哪个模块,后编译哪个模块由谁来决定的

在ActivityManifest.xml声明的Activity中,含有
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
是最先执行的,其它类就的顺序在这个主函数中先调用或跳转哪个就是哪个了

③ 如何使用eclipse创建Maven工程及其子模块

方法和步骤:

1,首先创建一个父类工程 子模块继承父类工程 并在父类工程的pom.xml文件中定义引入的jar及其版本号 子模块可以引用

4.创建工程完成

5.创建支持eclipse的多模块maven项目

通过maven可以创建多个关联模块的项目(Multiple Mole Projects)。由一个总的模块,下面包含多个子模块(子模块还可以包含子模块)。这种maven功能能支持大型的项目构建,往往大型项目由很多子模块组成。

以下说明在eclipse下如何创建多模块的maven项目。

(1)创建总的POM

mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=multi-moles-demo

(2)创建一个maven项目,然后修改该项目的pom.xml文件,package类型改为pom:

<packaging>pom</packaging>

并且删除src目录。

(3)创建子模块

在总模块目录下,创建子模块,比如web-demo:

mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=web-demo

( 4 )再创建一个比如日志模块:

mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=logging-demo

在总pom的pom.xml文件中已经自动加入:

<moles>
<mole>web-demo</mole>
<mole>logging-demo</mole>
</moles>
在各子模块的pom.xml文件中也自动加入了:

<parent>

<artifactId>multi-moles-demo</artifactId>

<groupId>com.easymorse.marshal</groupId>

<version>1.0-SNAPSHOT</version>

</parent>

子模块继承了总POM的package,这里需要修改,web-demo模块覆盖为:

<packaging>war</packaging>

logging-demo模块修改为

<packaging>jar</packaging>

对上级模块的特别设置

需要在上级模块中设置java编译的参数,现在eclipse一般都使用比较新的版本,默认jdk是1.6,而maven默认还是1.4。

<plugin>
<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>1.6</source>

<target>1.6</target>

<encoding>UTF-8</encoding>

</configuration>

</plugin>

对web子模块的特别设置

web子模块(web-demo)依赖它的日志模块logging-demo。设置pom.xml:

<dependency>
<groupId>com.easymorse.marshal</groupId>

<artifactId>logging-demo</artifactId>

<version>1.0-SNAPSHOT</version>

</dependency>

web子模块在生成eclipse项目时,需要wtp支持,需要设置eclipse插件:

<build>
<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-eclipse-plugin</artifactId>

<configuration>

<wtpmanifest>true</wtpmanifest>

<wtpapplicationxml>true</wtpapplicationxml>

<wtpversion>2.0</wtpversion>

</configuration>

</plugin>

</plugins>

</build>

( 5 )生成Eclipse项目

在multi-moles-demo项目根目录下:

mvn eclipse:eclipse

然后,通过eclipse的import项目导入,可发现两个项目:

logging-demo

web-demo

都导入进来。导入可能会出现错误,主要是因为没有设置maven的类路径变量“M2_REPO”,可以设置这个类变量到maven的本地repository陌路即可。

如果要在eclipse中使用m2eclipse,需要使用:

mvn eclipse:m2eclipse

这样就不需要设置M2_REPO类库变量了。

接下来可以:

通过eclipse配置的tomcat运行web-demo;

通过maven的tomcat或者jetty插件运行web-demo(需要配置pom.xml文件);

为项目打包便于分发和部署。

④ 多模块项目运行求解

一个多模块项目通过一个父POM 引用一个或多个子模块来定义。父项目,通过以下配置,将子项目关联。

[xhtml] view plain
<packaging>pom</packaging>
<moles>
<mole>simple-weather</mole>
<mole>simple-webapp</mole>
</moles>

其中值得注意的是<packaging>pom</packaging>这个父项目不像之前的项目那样创建一个JAR 或者一个WAR,它仅仅是一个引用其它Maven 项目的POM。pom.xml 中下一部分列出了项目的子模块。这些模块在moles元素中定义,每个moles 元素对应了一个simple-parent/目录下的子目录。Maven知道去这些子目录寻找pom.xml 文件,并且,在构建的simp-parent 的时候,它会将这些子模块包含到要构建的项目中。
当然,仅仅在父项目,配置子项目是不能够真正实现关联的,因为,这毕竟需要子项目的同意,故!子项目中需要配置:

[xhtml] view plain
<parent>
<groupId>org.sonatype.mavenbook.ch06</groupId>
<artifactId>simple-parent</artifactId>
<version>1.0</version>
</parent>

现在,通过父pom.xml将2个子项目进行了关联,那么我们需要从simple-parent 项目运行mvn clean install 命令,将2个子项目打包,编译为一个项目!
当Maven 执行一个带有子模块的项目的时候,Maven 首先载入父POM,然后定位所有的子模块POM。Maven 然后将所有这些项目的POM 放入到一个称为Maven 反应堆(Reactor)的东西中,由它负责分析模块之间的依赖关系。这个反应堆处理组件的排序,以确保相互独立的模块能以适当的顺序被编译和安装。
当,通过父pom.xml进行完成多个子项目的关联后,我们可以像前几章一样,分别进入某个单独的模块,进行运行,以移动程序!

注意:子项目的文件,位于父项目pom.xml同级,也就是,子项目的pom.xml位于父pom.xml的下一级文件中!
希望可以帮助到楼主!

⑤ Vue的父子组件问题,怎么分辨什么是父组件,什么是子组件

components 里面的就是子组件, 也就是你自定义的idv 模块,他是最外层DIV里面的一部分,那它就是子组件啊。
子传父数据用emit
父传子数据用props

⑥ 在python 中如何 import 父目录中的模块

在 python 中,如果当前目录中存在有 __init__.py 文件,则表示该目录为一个包(package),在包中,引用同级目录或子目录中的其它模块非常简单,直接使用 import 语句即可,并且如果是同级目录,没有 __init__.py 文件亦可。但如何导入父目录中的其它模块呢,在 python 的世界里,没有像 C 中直接使用 ../ 来退级的方式,像 import ../test 这样的语句是不合法的。其它,如果理工清楚了 import 语句的工作原理,就好办了,import 工作时,就是根据模块名,从 sys.path 所包含的路径中寻找对应的模块名,如果能找到,则将其它导入到当前运行环境,根据这个规则,有如下两种方式解决上述问题:
1、修改 sys.path 法:在导入父目录中的模块前,先修改 sys.path 的值,如导入父目录中的 test 模块,导入方法如下:import syssys.path.insert(0, "..") ;# or�0�2 sys.path.append("..")
2、将包的根目录以外链的形式加入到 sys.path 中,即在 {PYTHON-HOME}\lib\site-packages 中新建一个 .pth 文件,文件内容为包根路径,假设包的根目录为 d:/py/mytest/,则可以在 {PYTHON-HOME}\lib\site-packages 目录下建一个 mytest.pth 的文件,内容为 d:/py/mytest。完成上述步骤后,则可以在任何模块中像导入已安装的系统包一样导入 mytest 包或是该包下的所有模块,如 import mytest。注意,由于 python 的版本不同,在 v2.5 版以后,需要在 __init__.py 文件中显示地使用 __all__ 变量指明当前包下有哪些模块,要不此包是无法正常导入和工作地

⑦ webpack执行机制流程是怎么样的

几乎所有业务的开发构建都会用到 webpack 。的确,作为模块加载和打包神器,只需配置几个文件,加载各种 loader 就可以享受无痛流程化开发。但对于 webpack 这样一个复杂度较高的插件集合,它的整体流程及思想对我们来说还是很透明的。那么接下来我会带你了解 webpack 这样一个构建黑盒,首先来谈谈它的流程。 准备工作 1. webstorm 中配置 webpack-webstorm-debugger-script 在开始了解之前,必须要能对 webpack 整个流程进行 debug ,配置过程比较简单。 先将 webpack-webstorm-debugger-script 中的软件外包企业公司 置于 webpack.config.js 的同一目录下,搭建好你的脚手架后就可以直接 Debug 这个 webstorm-debugger.js 文件了。 2. webpack.config.js 配置 估计大家对 webpack.config.js 的配置也尝试过不少次了,这里就大致对这个配置文件进行个分析。 var path = require('path'); var node_moles = path.resolve(__dirname, 'node_moles'); var pathToReact = path.resolve(node_moles, 'react/dist/react.min.js'); mole.exports = { // 入口文件,是模块构建的起点,同时每一个入口文件对应最后生成的一个 chunk。 entry: { bundle: [ 'webpack/hot/dev-server', 'webpack-dev-server/client?', path.resolve(__dirname, 'app/app.js') ], }, // 文件路径指向(可加快打包过程)。 resolve: { alias: { 'react': pathToReact } }, // 生成文件,是模块构建的终点,包括输出文件与输出路径。 output: { path: path.resolve(__dirname, 'build'), filename: '[name].js', }, // 这里配置了处理各模块的 loader ,包括 css 预处理 loader ,es6 编译 loader,图片处理 loader。 mole: { loaders: [ { test: /\.js$/, loader: 'babel', query: { presets: ['es2015', 'react'] } } ], noParse: [pathToReact] }, // webpack 各插件对象,在 webpack 的事件流中执行对应的方法。 plugins: [ new webpack.HotMoleReplacementPlugin(); ] }; 除此之外再大致介绍下 webpack 的一些核心概念: loader : 能转换各类资源,并处理成对应模块的加载器。loader 间可以串行使用。 chunk : code splitting后的产物,也就是按需加载的分块,装载了不同的mole。 对于mole和chunk的关系可以参照webpack官方的这张图: plugin : webpack 的插件实体,这里以 UglifyJsPlugin 为例。 function UglifyJsPlugin(options) { this.options = options; } mole.exports = UglifyJsPlugin; UglifyJsPlugin.prototype.apply = function(compiler) { compiler.plugin("compilation", function(compilation) { compilation.plugin("build-mole", function(mole) { }); compilation.plugin("optimize-chunk-assets", function(chunks, callback) { // Uglify 逻辑 }); compilation.plugin("normal-mole-loader", function(context) { }); }); }; 在 webpack 中你经常可以看到 compilation.plugin('xxx', callback) ,你可以把它当作是一个事件的绑定,这些事件在打包时由 webpack 来触发。 3. 流程总览 在具体流程学习前,可以先通过这幅 webpack整体流程图 了解一下大致流程(建议保存下来查看)。 shell 与 config 解析 每次在命令行输入 webpack 后,操作系统都会去调用 ./node_moles/.bin/webpack 这个 shell 脚本。这个脚本会去调用./node_moles/webpack/bin/webpack.js 并追加输入的参数,如 -p , -w 。(图中 webpack.js 是 webpack 的启动文件,而 $@ 是后缀参数) 在 webpack.js 这个文件中 webpack 通过 optimist 将用户配置的 webpack.config.js 和 shell 脚本传过来的参数整合成 options 对象传到了下一个流程的控制对象中。 1. optimist 和 commander 一样,optimist 实现了 node 命令行的解析,其 API 调用非常方便。 var optimist = require("optimist"); optimist .boolean("json").alias("json", "j").describe("json") .boolean("colors").alias("colors", "c").describe("colors") .boolean("watch").alias("watch", "w").describe("watch") ... 获取到后缀参数后,optimist 分析参数并以键值对的形式把参数对象保存在 optimist.argv 中,来看看 argv 究竟有什么? // webpack --hot -w { hot: true, profile: false, watch: true, ... } 2. config 合并与插件加载 在加载插件之前,webpack 将 webpack.config.js 中的各个配置项拷贝到 options 对象中,并加载用户配置在 webpack.config.js 的 plugins 。接着 optimist.argv 会被传入到 ./node_moles/webpack/bin/convert-argv.js 中,通过判断 argv 中参数的值决定是否去加载对应插件。(至于 webpack 插件运行机制,在之后的运行机制篇会提到) ifBooleanArg("hot", function() { ensureArray(options, "plugins"); var HotMoleReplacementPlugin = require("../lib/HotMoleReplacementPlugin"); options.plugins.push(new HotMoleReplacementPlugin()); }); ... return options; options 作为最后返回结果,包含了之后构建阶段所需的重要信息。 { entry: {},//入口配置 output: {}, //输出配置 plugins: [], //插件集合(配置文件 + shell指令) mole: { loaders: [ [Object] ] }, //模块配置 context: //工程路径 ... } 这和 webpack.config.js 的配置非常相似,只是多了一些经 shell 传入的插件对象。插件对象一初始化完毕, options 也就传入到了下个流程中。 var webpack = require("../lib/webpack.js"); var compiler = webpack(options); 编译与构建流程 在加载配置文件和 shell 后缀参数申明的插件,并传入构建信息 options 对象后,开始整个 webpack 打包最漫长的一步。而这个时候,真正的 webpack 对象才刚被初始化,具体的初始化逻辑在 lib/webpack.js 中,如下: function webpack(options) { var compiler = new Compiler(); ...// 检查options,若watch字段为true,则开启watch线程 return compiler; } ... webpack 的实际入口是 Compiler 中的 run 方法,run 一旦执行后,就开始了编译和构建流程 ,其中有几个比较关键的 webpack 事件节点。 compile 开始编译 make 从入口点分析模块及其依赖的模块,创建这些模块对象 build-mole 构建模块 after-compile 完成构建 seal 封装构建结果 emit 把各个chunk输出到结果文件 after-emit 完成输出 1. 核心对象 Compilation compiler.run 后首先会触发 compile ,这一步会构建出 Compilation 对象: compilation类图 这个对象有两个作用,一是负责组织整个打包过程,包含了每个构建环节及输出环节所对应的方法,可以从图中看到比较关键的步骤,如 addEntry() , _addMoleChain() , buildMole() , seal() , createChunkAssets() (在每一个节点都会触发 webpack 事件去调用各插件)。二是该对象内部存放着所有 mole ,chunk,生成的 asset 以及用来生成最后打包文件的 template 的信息。 2. 编译与构建主流程 在创建 mole 之前,Compiler 会触发 make,并调用 Compilation.addEntry 方法,通过 options 对象的 entry 字段找到我们的入口js文件。之后,在 addEntry 中调用私有方法 _addMoleChain ,这个方法主要做了两件事情。一是根据模块的类型获取对应的模块工厂并创建模块,二是构建模块。 而构建模块作为最耗时的一步,又可细化为三步: 调用各 loader 处理模块之间的依赖 webpack 提供的一个很大的便利就是能将所有资源都整合成模块,不仅仅是 js 文件。所以需要一些 loader ,比如 url-loader ,jsx-loader , css-loader 等等来让我们可以直接在源文件中引用各类资源。webpack 调用 doBuild() ,对每一个 require() 用对应的 loader 进行加工,最后生成一个 js mole。 Compilation.prototype._addMoleChain = function process(context, dependency, onMole, callback) { var start = this.profile && +new Date(); ... // 根据模块的类型获取对应的模块工厂并创建模块 var moleFactory = this.dependencyFactories.get(dependency.constructor); ... moleFactory.create(context, dependency, function(err, mole) { var result = this.addMole(mole); ... this.buildMole(mole, function(err) { ... // 构建模块,添加依赖模块 }.bind(this)); }.bind(this)); }; 调用 acorn 解析经 loader 处理后的源文件生成抽象语法树 AST Parser.prototype.parse = function parse(source, initialState) { var ast; if(!ast) { // acorn以es6的语法进行解析 ast = acorn.parse(source, { ranges: true, locations: true, ecmaVersion: 6, sourceType: "mole" }); } ... }; 遍历 AST,构建该模块所依赖的模块 对于当前模块,或许存在着多个依赖模块。当前模块会开辟一个依赖模块的数组,在遍历 AST 时,将 require() 中的模块通过addDependency() 添加到数组中。当前模块构建完成后,webpack 调用 processMoleDependencies 开始递归处理依赖的 mole,接着就会重复之前的构建步骤。 Compilation.prototype.addMoleDependencies = function(mole, dependencies, l, cacheGroup, recursive, callback) { // 根据依赖数组(dependencies)创建依赖模块对象 var factories = []; for(var i = 0; i < dependencies.length; i++) { var factory = _this.dependencyFactories.get(dependencies[i][0].constructor); factories[i] = [factory, dependencies[i]]; } ... // 与当前模块构建步骤相同 } 3. 构建细节 mole 是 webpack 构建的核心实体,也是所有 mole的 父类,它有几种不同子类:NormalMole , MultiMole ,ContextMole , DelegatedMole 等。但这些核心实体都是在构建中都会去调用对应方法,也就是 build() 。来看看其中具体做了什么: // 初始化mole信息,如context,id,chunks,dependencies等。 NormalMole.prototype.build = function build(options, compilation, resolver, fs, callback) { this.buildTimestamp = new Date().getTime(); // 构建计时 this.built = true; return this.doBuild(options, compilation, resolver, fs, function(err) { // 指定模块引用,不经acorn解析 if(options.mole && options.mole.noParse) { if(Array.isArray(options.mole.noParse)) { if(options.mole.noParse.some(function(regExp) { return typeof regExp === "string" ? this.request.indexOf(regExp) === 0 : regExp.test(this.request); }, this)) return callback(); } else if(typeof options.mole.noParse === "string" ? this.request.indexOf(options.mole.noParse) === 0 : options.mole.noParse.test(this.request)) { return callback(); } } // 由acorn解析生成ast try { this.parser.parse(this._source.source(), { current: this, mole: this, compilation: compilation, options: options }); } catch(e) { var source = this._source.source(); this._source = null; return callback(new MoleParseError(this, source, e)); } return callback(); }.bind(this)); }; 对于每一个 mole ,它都会有这样一个构建方法。当然,它还包括了从构建到输出的一系列的有关 mole 生命周期的函数

⑧ idea maven父模块要加载子模块吗

如果你只是希望在子模块中依赖父模块中相同版本的spring相关的dependency, 可以在父模块中的dependencyManagement定义公共依赖, 然后子模块中依赖相应的dependency时,就不用写version字段了,只写groupId跟artifactId就可以了。

⑨ verilog中在同一模块中调用其他多个模块,模块是顺序执行的吗

是。

模块在语言形式上是以关键词mole开始,以关键词endmole结束的一段程序。在做模块划分时,通常会出现这种情形:某个大的模块中包含了一个或多个功能子模块。verilog是通过模块调用或称为模块实例化的方式来实现这些子模块与高层模块的连接的。

按照每个模块并行工作的思路来调整设计。这给软件开发人员入门带来了难度,但是同时也是FPGA的价值所在,正因为FPGA能够并行执行,所以很多算法和设计可以在低频时钟下高实时性,快速出结果。

(9)父模块和子模块编译顺序扩展阅读:

注意事项:

若一个模块temp需要调用adder模块时,temp中的与adder想连的端口需要与adder中声明的端口顺序一致。端口的介绍,可以参阅点击打开链接。 调用首先写被调用模块的名称(adder) ,随后的是实例名(add,用户自行定义),然后按adder中端口的顺序写下实例的端口名即可。

一般设计中用到的触发器只有一个时钟,除非在工艺中有专门的器件,并且在设计中进行专门的指定,否则这种设计在综合的时候是通不过的。

⑩ maven 模块与模块之间怎么更新

置条件:
1.安装有吃饭的家伙JAVA和MAVEN.
首先,需要有一个packaging类型为pom的pom.xml文件即我们的parent项目pom文件.在这个parent项目中配置好groupId,artifactId,version以及properties,prerequisites,dependencies.
还有一个重要的配置项是moles.加入了这个项目之后执行maven版本号更新时才会同时去更新子模块的版本号.
子模块改变的部分:
<parent>
<groupId>com.hlf</groupId>
<artifactId>common-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.hlf</groupId>
<artifactId>projectA</artifactId>

发现没有,在这里只放了父模块的version没有放子模块的.
这时我们执行:
>mvn versions:set -DnewVersion=0.0.2-SNAPSHOT
会发现在父模块和子模块下面都生成maven的版本控制文件(姑且这么叫吧,虽然看起来就是一个文件备份)pom.xml.versionsBackup.
同时,父模块和子模块的verion都更新为了0.0.2-SNAPSHOT.
<parent>
<groupId>com.hlf</groupId>
<artifactId>common-parent</artifactId>
<version>0.0.2-SNAPSHOT</version>
</parent>
<groupId>com.hlf</groupId>
<artifactId>projectA</artifactId>
到这里已经完成了子模块的版本号更新.

阅读全文

与父模块和子模块编译顺序相关的资料

热点内容
phplinux时间 浏览:447
云服务器20性能 浏览:986
android强制系统横屏 浏览:280
怎么提前看未播出的电视剧app 浏览:666
cad转pdf图层 浏览:600
程序员接私活初级 浏览:434
全无油润滑压缩机 浏览:185
代码加密常用方法 浏览:953
安卓手机如何解除已禁用 浏览:396
算法的随机性 浏览:486
高中解压体育游戏 浏览:533
androidstudior丢失 浏览:345
命令行笔记 浏览:738
360目标文件夹访问拒绝 浏览:519
3b编程加工指令 浏览:790
c8051f系列单片机选型手册 浏览:773
南昌php程序员 浏览:513
bcs命令 浏览:447
如何在服务器指向域名 浏览:417
车床编程可以做刀吗 浏览:519