褲子構建工具簡介
1. 概述
Pants是一種支持多種編程語言的構建工具。它是一種快速、可擴展且用戶友好的構建工具,適用於各種規模的代碼庫。它非常適合使用多種語言的多語言項目。
在本教程中,我們將學習如何使用 Java 配置 Pants、定義BUILD
文件、添加依賴項、測試等。
2. 褲子製作工具
構建工具對於自動化軟件開發工作流程至關重要。 Maven 和 Gradle 在 Java 生態系統中很流行。然而,他們可能會難以應對大型多語言代碼庫。
Pants 構建工具提供任何構建系統的基本功能,包括測試運行器、代碼生成器、代碼編譯器、依賴解析器、打包器等。
該工具適用於具有多個項目的單個代碼庫。特別是在項目是用多種編程語言編寫的情況下。這稱為 monorepo 架構。
目前,它支持Python、Go、Java、Scala和Shell。對更多編程語言的支持即將到來。
3. 初始設置
安裝二進製文件後,可以輕鬆設置 Pants 項目。它支持 Windows、Linux 和 MacOS。
要設置 Java Pants 項目,我們首先為該項目創建一個目錄:
$ mkdir hello-pant
接下來,我們將切換到該目錄,創建pants.toml
文件,並為項目添加相關後端:
[GLOBAL]
backend_packages = [
"pants.backend.experimental.java",
]
在這裡,我們告訴 Pants 我們正在開發一個 Java 項目。由於 Pants 是 monorepo 項目的一個很好的構建工具,我們可以配置pants.toml
來提供對多種編程語言的支持:
[GLOBAL]
backend_packages = [
"pants.backend.experimental.java",
"pants.backend.experimental.scala",
]
在上面的配置中,我們配置 Pants 以提供對 Java 和 Scala 的支持。
設置語言支持後,我們可以繼續為我們的項目創建目錄結構。在根目錄中,我們將創建代碼所在的src
目錄:
$ mkdir –p src/com/baeldung/hellopant
此外,我們將在根文件夾中創建一個tests
目錄:
$ mkdir –p test/com/baeldung/hellopant
在這裡,我們將放置我們的單元測試。
4. 編譯代碼
Pants 使編譯代碼和生成 JAR 文件變得容易。在本節中,我們將探討如何使用 Pants 編譯、運行測試並將代碼打包到 JAR 文件中。
4.1.生成BUILD
文件
在上一節中,我們創建了 Java 項目的包結構。接下來,我們將一個名為Hello.java
源文件添加到src
目錄中:
public class Hello {
public static void main(String [] args) {
System.out.println ("Hello World!");
}
}
上面的程序包含傳統的“ Hello World!
”。
為了讓Pants執行任何代碼,我們需要通過執行tailor
命令來生成一個BUILD
文件:
$ pants tailor ::
上面的命令在包含庫代碼和測試文件的junit_tests
每個目錄中創建java_sources
目標:
Created src/com/baeldung/hellopant/BUILD:
- Add java_sources target hellopant
Created test/com/baeldung/hellopant/BUILD:
- Add junit_tests target tests
如果沒有BUILD
文件,代碼將無法編譯。
以下是用於測試的BUILD
文件的內容:
junit_tests(
name="tests",
)
另外,以下是src
文件夾中代碼的BUILD
文件的內容:
java_sources(
)
此外,我們需要生成一個鎖定文件來設置應用程序使用默認的 JVM 並管理第三方依賴項:
$ pants generate-lockfiles
上面的命令在項目根目錄中創建一個新目錄,其中包含一個名為default.lock
的文件和一個名為jvm
的子文件夾。
最後,讓我們執行Hello.java
程序:
pants run src/com/baeldung/hellopant/Hello.java
在這裡,我們運行pants
命令來執行代碼。一個項目可以包含多個目標,我們總是需要通過指定其路徑來指定要編譯的代碼。執行命令後,輸出“ Hello World!
”到控制台。
4.2.添加第三方依賴
添加第三方依賴項可能很棘手——我們需要default.lock
來定義第三方依賴項。在上一節中,我們了解瞭如何生成default.lock
文件,該文件位於第三方文件夾中。
讓我們通過將 Guava 依賴項添加到我們的初始設置中來理解這個過程。首先,我們修改default.lock
文件:
# {
# "version": 1,
# "generated_with_requirements": [
# "com.google.guava:guava:18.0,url=not_provided,jar=not_provided",
# ]
# }
在這裡,我們將Guava依賴項添加到generated_with_requirements
字段。接下來,我們將在生成依賴項之前在jvm
目錄中創建一個新目錄,其中包含有關依賴項的信息。
讓我們切換到jvm
目錄並為 Guava 創建文件夾:
$ mkdir -p com/google/guava
然後,讓我們添加一個包含工件信息的BUILD
文件:
jvm_artifact(
group="com.google.guava",
artifact="guava",
version="32.1.1-jre",
)
該文件包含下載項目中使用的 Guava 依賴項所需的信息。值得注意的是,文件夾結構與工件組名稱類似。以com
開頭的任何其他依賴項都應在com
文件夾中定義。
例如,假設我們要添加Jackson Core依賴項。由於其組名稱以com
開頭,因此我們可以在添加BUILD
文件之前切換到com
文件夾並創建其余文件夾:
$ mkdir -p fasterxml/jackson/core
定義工件信息後,我們將執行pants generate-lockfiles
命令:
$ pants generate-lockfiles
此命令查找default.lock
文件並生成其中定義的依賴項。
在本例中,它會下載 Guava 依賴項,我們可以導入它以在項目中使用。
4.3.運行測試
我們可以通過將Junit依賴項添加到項目來運行單元測試。讓我們更新default.lock
文件:
# "generated_with_requirements": [
# "junit:junit:4.13.2,url=not_provided,jar=not_provided",
# ]
接下來,我們在jvm
文件夾中創建目錄來定義artifact的信息:
$ mkdir -p junit/junit
在這裡,我們使用group
和artifact
名稱創建目錄。接下來,我們在junit
子文件夾中創建一個BUILD
文件:
jvm_artifact(
group="junit",
artifact="junit",
version="4.13.2"
)
最後,讓我們執行generate命令來下載新的依賴項:
$ pants generate-lockfiles
這將使用有關添加的依賴項的詳細信息更新default.lock
文件。
此外,讓我們編寫一個單元測試來測試 Guava 庫中的Joiner
類:
class GuavaUnitTest {
@Test
void whenConvertListToStringAndSkipNull_thenConverted() {
List<String> names = Lists.newArrayList("John", null, "Jane", "Adam", "Tom");
final String result = Joiner.on(",")
.skipNulls()
.join(names);
assertEquals(result, "John,Jane,Adam,Tom");
}
}
在上面的代碼中,我們創建一個名稱ArrayList
,並使用Joiner
連接名稱並跳過空值。
要使用 Pants 運行測試,我們將使用pants test
命令:
$ pants test test/com/baeldung/hellopant/GuavaUnitTest.java
我們指定測試文件的路徑。 Pants無論成功還是失敗都會將測試結果輸出到控制台:
上面的輸出表明測試已通過。
4.4.資源目標
我們可以通過在src
目錄中創建 resources 文件夾來加載文件作為資源。讓我們在src
目錄中創建一個resource
文件夾:
$ mkdir -p resource/com/baeldung/hellopant
這將創建一個包含多個子文件夾的resource
文件夾。接下來,我們在最後一個子目錄中創建word.txt
文件。該文件包含文本“ from Us”
。
然後,讓我們在包含資源文件信息的目錄中創建一個BUILD
文件:
resources(name = "word", sources=["word.txt"])
BUILD
文件具有文件名和路徑。
接下來,讓我們編寫一個單元測試來在代碼中導入資源文件:
@Test
public void whenGettingTextFromAResourceFile_thenJoined() throws IOException {
String world = Resources.toString(Resources.getResource(GuavaUnitTest.class, "word.txt"), Charsets.UTF_8).strip();
String result = Joiner.on(" ").join("Hello", world);
assertEquals(result, "Hello from Us");
}
上面的代碼讀取資源文件的內容並用“ Hello
”連接起來。在運行測試之前,我們需要將資源目標依賴項添加到測試BUILD
文件中:
junit_tests(
name="tests",
dependencies=[
"src/resources/com/baeldung/hellopant:word",
],
)
在這裡,我們更新了測試BUILD
文件以包含word.txt
作為測試的依賴項。使用指定的依賴項運行測試可確保成功。
4.5.打包成JAR
將程序打包為 JAR 文件很容易。首先,我們需要在src
文件夾中的BUILD
文件中定義目標:
java_sources()
deploy_jar(
name="HelloPant",
main="com.baeldung.hellopant",
dependencies=[
":hellopant",
],
)
在上面的配置中,我們添加了一個新屬性deploy_jar
,並將JAR文件的名稱設置為HelloPant
。另外,我們還設置了查找入口代碼的目錄。
要構建 jar,我們將運行pants package
命令:
$ pants package ::
成功執行該命令會在項目根目錄中創建一個包含 JAR 文件的dist
文件夾:
我們現在可以訪問dist
文件夾中的 JAR 文件。
5. 使用 IDE
Pants 項目可以通過構建服務器協議 (BSP) 輕鬆加載到 IntelliJ IDEA 上。默認情況下,IntelliJ 不提供 BSP 支持。我們需要安裝帶有 BSP 支持的 Scala 插件。
接下來,我們需要在項目根目錄下創建bsp-groups.toml
文件來添加組配置:
[groups.default]
addresses = [
"src/jvm::",
"tests/jvm::",
]
resolve = "jvm:jvm-default"
上面的配置指定了我們的代碼的目錄並解析為使用默認的 JVM。
然後,我們將更新pants.toml
文件以創建有關 BSP 配置的意識:
[experimental-bsp]
groups_config_files = ["bsp-groups.toml"]
最後,我們可以將項目導入到IntelliJ中。它調用 Pants 來運行 BSP 服務器並同步狀態以生成 IntelliJ 模塊。
6. 其他功能
Pants 加載了基於指定標準格式化代碼、設置測試超時以及顯式配置項目的 JDK 版本的功能。
6.1. Lint 和格式
我們可以為褲子添加格式樣式。 Pants 支持 Google Java 格式,我們可以通過更新pants.toml
中的packaeges_backend
來啟用該格式:
[GLOBAL]
backend_packages = [
"pants.backend.experimental.java",
"pants.backend.experimental.java.lint.google_java_format"
]
在這裡,我們添加了一個新的後端包來提供 linting 和格式化支持。
讓我們格式化安裝項目的src
目錄:
$ pants fmt test/com::
上面的命令將test
目錄中的代碼格式化為使用 Google 格式樣式。我們可以通過執行lint
命令來檢查代碼的格式是否正確:
$ pants lint ::
這會檢查所有代碼文件並確定它們的格式是否正確。
6.2.設置超時
Pants 提供了設置測試超時的功能。任何花費超過設定超時時間的測試都將被終止。這對於防止測試無限期掛起很有用。
要設置超時,我們將編輯測試目錄中的BUILD
文件:
junit_tests(
name="tests",
timeout=120,
)
這裡,我們將超時設置為120
秒。如果測試未能及時完成,測試將被終止。
我們還可以在pants.toml
中設置默認超時和最大超時:
[test]
timeout_default = 60
timeout_maximum = 120
這適用於項目中的所有目標。如果目標將其超時設置超出默認值,Pants 將使用默認超時。
此外,我們可以在運行測試時禁用超時,特別是在調試時:
$ pants test --no-timeouts
上面的命令禁用測試的超時限制。
6.3.設置JDK版本
我們可以通過在pants.toml
中配置jdk
字段來為我們的項目設置JDK:
[jvm]
jdk = 1.8
這會將 JDK 設置為 Java 8。如果未設置,Pants 將解析為主機的默認 JDK。
七、結論
在本文中,我們了解了 Pants 構建工具的基本功能。此外,我們還使用 Java 編程語言研究了它的用法。此外,我們還了解瞭如何將其與 IDE 集成。對於基於 monorepo 架構的項目來說,Pants 是一個很好的工具。
與往常一樣,示例的源代碼可在 GitHub 上獲取。