对于最新的稳定版本,请使用 spring-cloud-contract 5.0.0!spring-doc.cadn.net.cn

我如何用 Git 作为合同和存根的存储?

在多语世界中,有些语言不使用二进制存储,例如 Artifactory和Nexus可以。从Spring Cloud Contract 2.0.0版本开始,我们提供 将合同和存根存储在SCM(源控管理)仓库中的机制。目前, 唯一支持的SCM是Git。spring-doc.cadn.net.cn

仓库必须具备以下设置 (你可以在这里查看):spring-doc.cadn.net.cn

.
└── META-INF
    └── com.example
        └── beer-api-producer-git
            └── 0.0.1-SNAPSHOT
                ├── contracts
                │   └── beer-api-consumer
                │       ├── messaging
                │       │   ├── shouldSendAcceptedVerification.groovy
                │       │   └── shouldSendRejectedVerification.groovy
                │       └── rest
                │           ├── shouldGrantABeerIfOldEnough.groovy
                │           └── shouldRejectABeerIfTooYoung.groovy
                └── mappings
                    └── beer-api-consumer
                        └── rest
                            ├── shouldGrantABeerIfOldEnough.json
                            └── shouldRejectABeerIfTooYoung.json

元步兵文件夹:spring-doc.cadn.net.cn

  • 我们将应用按以下方式分类组ID(例如:com.example).spring-doc.cadn.net.cn

  • 每个应用由其表示artifactId(遗物ID(例如,Beer-api-producer-git).spring-doc.cadn.net.cn

  • 接下来,每个应用程序按其版本组织(例如:0.0.1-快照).开始 摘自春云合约版本2.1.0,你可以指定以下版本 (假设你的版本遵循语义版本):spring-doc.cadn.net.cn

    • +最近的: 以查找你存根的最新版本(假设快照 总是为给定修订号下的最新文物)。这意味着:spring-doc.cadn.net.cn

      • 如果你有1.0.0.发布,2.0.0.构建快照2.0.0.发布,我们假设 最新的是2.0.0.构建快照.spring-doc.cadn.net.cn

      • 如果你有1.0.0.发布2.0.0.发布,我们假设最新的是2.0.0.发布.spring-doc.cadn.net.cn

      • 如果你有一个版本叫做最近的或者,我们会选择那个文件夹。+spring-doc.cadn.net.cn

    • 释放: 查找您作品的最新版本。这意味着:spring-doc.cadn.net.cn

最后,有两个文件夹:spring-doc.cadn.net.cn

  • 合同: 良好的做法是存储每个人所需的合同 包含 consumer 名称的文件夹中的 summer(例如Beer-API-Consumer).这样,你 可以使用每个消费者的存根数特征。进一步的目录结构是任意的。spring-doc.cadn.net.cn

  • 映射: Maven 或 Gradle Spring Cloud Contract 插件推送 存根服务器映射在这个文件夹里。在消费者端,Stub Runner 会扫描该文件夹 用存根定义开始创建存根服务器。文件夹结构是复制品 在合同子文件夹。spring-doc.cadn.net.cn

议定书公约

控制合同来源的类型和地点(例如 二进制存储或SCM存储库),你可以在 URL 中使用该协议 仓库。Spring Cloud Contract 对注册协议解析器进行迭代 并尝试通过插件获取合同或存根(来自 Stub Runner)。spring-doc.cadn.net.cn

对于SCM功能,目前我们支持Git仓库。要用它, 在需要放置仓库 URL 的属性中,你必须做前缀 连接URL为git://.以下列表展示了一些示例:spring-doc.cadn.net.cn

git://file:///foo/bar
git://https://github.com/spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git
git://[email protected]:spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git

制作人

对于生产者来说,为了使用SCM(源控制管理)方法,我们可以重复使用以下内容 和我们用在外部合同上的机制一样。我们路由春云合约 使用 SCM 实现,从以 这git://协议。spring-doc.cadn.net.cn

你必须手动添加pushStubsToScm目标在Maven中或使用(绑定)pushStubsToScm任务 Gradle。我们不会将存根推送到起源你那混蛋 存储 库。

以下列表包含了Maven和Gradle构建文件的相关部分:spring-doc.cadn.net.cn

梅文
<plugin>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-contract-maven-plugin</artifactId>
    <version>${spring-cloud-contract.version}</version>
    <extensions>true</extensions>
    <configuration>
        <!-- Base class mappings etc. -->

        <!-- We want to pick contracts from a Git repository -->
        <contractsRepositoryUrl>git://https://github.com/spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git</contractsRepositoryUrl>

        <!-- We reuse the contract dependency section to set up the path
        to the folder that contains the contract definitions. In our case the
        path will be /groupId/artifactId/version/contracts -->
        <contractDependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>${project.artifactId}</artifactId>
            <version>${project.version}</version>
        </contractDependency>

        <!-- The contracts mode can't be classpath -->
        <contractsMode>REMOTE</contractsMode>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <!-- By default we will not push the stubs back to SCM,
                you have to explicitly add it as a goal -->
                <goal>pushStubsToScm</goal>
            </goals>
        </execution>
    </executions>
</plugin>
格拉德勒
contracts {
	// We want to pick contracts from a Git repository
	contractDependency {
		stringNotation = "${project.group}:${project.name}:${project.version}"
	}
	/*
	We reuse the contract dependency section to set up the path
	to the folder that contains the contract definitions. In our case the
	path will be /groupId/artifactId/version/contracts
	 */
	contractRepository {
		repositoryUrl = "git://https://github.com/spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git"
	}
	// The mode can't be classpath
	contractsMode = "REMOTE"
	// Base class mappings etc.
}

/*
In this scenario we want to publish stubs to SCM whenever
the `publish` task is invoked
*/
publish.dependsOn("publishStubsToScm")

你还可以进一步定制发表小作品至Scm。Gradle 任务。在以下例子中, 该任务可自定义,从本地 git 仓库中选择合同:spring-doc.cadn.net.cn

Gradle
publishStubsToScm {
	// We want to modify the default set up of the plugin when publish stubs to scm is called
	// We want to pick contracts from a Git repository
	contractDependency {
		stringNotation = "${project.group}:${project.name}:${project.version}"
	}
	/*
	We reuse the contract dependency section to set up the path
	to the folder that contains the contract definitions. In our case the
	path will be /groupId/artifactId/version/contracts
	 */
	contractRepository {
		repositoryUrl = "git://file://${new File(project.rootDir, "../target")}/contract_empty_git/"
	}
	// We set the contracts mode to `LOCAL`
	contractsMode = "LOCAL"
	}
重要

从以下2.3.0.发布自定义{}此前用于发表小作品至Scm。自定义功能不再可用。设置应该直接应用 在发表小作品至Scm。闭包,如前例所示。spring-doc.cadn.net.cn

采用这样的设置:spring-doc.cadn.net.cn

本地存储合同的制作人

另一种将SCM作为存根和合同目的地的选项是存储 本地与制作人签约,只将合同和存根推送到SCM。 以下项目展示了使用 Maven 和 Gradle 实现这一目标所需的设置。spring-doc.cadn.net.cn

采用这样的设置:spring-doc.cadn.net.cn

将与制片方的合同和存根保存在外部仓库中

你也可以把合同保留在生产者仓库里,但存根则放在外部的 git 仓库里。 当你想使用基础的消费者-生产者协作流程但无法使用时,这最有用 使用工件仓库来存储存根。spring-doc.cadn.net.cn

为此,使用通常的制作人设置,然后添加pushStubsToScm目标与设定contractsRepositoryUrl去你想存放存根的仓库。spring-doc.cadn.net.cn

消费者

在消费者方面,当通过repositoryRoot参数 无论是来自@AutoConfigureStubRunner注释, JUnit 4 规则、JUnit 5 扩展或属性,你可以传递 SCM仓库,前缀为git://协议。以下示例展示了如何实现:spring-doc.cadn.net.cn

@AutoConfigureStubRunner(
    stubsMode="REMOTE",
    repositoryRoot="git://https://github.com/spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git",
    ids="com.example:bookstore:0.0.1.RELEASE"
)

采用这样的设置:spring-doc.cadn.net.cn