您应该能够毫不费力地使用流来做到这一点。假设我了解您在做什么,我们使用流解决了类似的问题。
我们有一系列由内部组维护的库,预计将用于各种应用程序。这些都保存在自己的流中:
//LibraryA/main/...
//LibraryB/main/...
对于主要版本,它们被锁定到发行版:
//LibraryA/r1_0/...
//LibraryB/r2_0/...
//LibraryB/r2_0/...
这样我们就可以保持 API 的一致性,而不必在其他流中使用 @ 规范。这对您来说可能是不必要的步骤,但它对我们有帮助。
然后我们有我们的项目,也在流中:
//Project1/main/...
//Project1/r1_0/...
//Project2/main/...
//Project2/r1_0/...
对于每个项目流,使用import
指令包含库,因此流规范为//Project1/main/...
:
share ...
import LibraryA/... //LibraryA/main/...
import LibraryB/... //LibraryB/r1_0/...
在这种情况下,该share
行声明 main 的子流将共享所有直接属于该流的文件,并且该import
行指示将特定库以只读方式导入到流中的目录中。在这种情况下,流//LibraryA/main/...
被导入LibraryA/...
树等。
签出版本的结果/Project1/main/
:
project1.html
images/p1i1.jpg
images/p1i2.jpg
LibraryA/l1c1.c
LibraryA/l1c2.c
LibraryB/l2c1.c
LibraryB/l2c2.c
/LibraryA/main/...
当对流或/LibraryB/r1_0
流和/Project1/main/...
is进行更改时p4 sync ...
,您将获得每个库的最新代码。
至于 qa/dev/stage/prod 环境,从您的问题定义中不太清楚它们有何不同,但这里有两个选项:
如果它们只是环境,您可以将它们设置为流工作区,并且它们可以单独用于检出和可能修改数据的版本。
如果它们应该暗示从 dev->qa->stage->prod 或类似的流程移动,您可以将它们实现为流并显式提升代码以从一个移动到下一个。例如:
//Project1/dev
//Project1/qa
//Project1/stage
//Project1/prod
在这种情况下,dev
可能是主线流,如果根本没有编辑功能 ,则可能是使用虚拟qa
流类型的只读流。可能是来自流的发布流。stage
dev
这种结构很大程度上取决于您如何定义开发过程。在更敏捷的过程中,主线分支应该与您的开发分支保持非常接近,并且您可以使用稳定的主线持续交付。在更多的瀑布过程中,您可能会有发布分支,它们从主线分支接收代码以进行测试和移动到生产。