① 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>
到這里已經完成了子模塊的版本號更新.