TFS 构建期间的共享程序集属性
Shared assembly attributes during TFS builds
我正在寻找一个优雅的解决方案(如果有的话)来解决链接到项目外共享程序集属性文件然后将该项目推送到 TFS 以进行构建的问题。
我正在将我所有的本地解决方案和项目转换为源代码管理(这已经很长时间了)并将共享代码发布为 NuGet 包。我的新设计强制每个包一个解决方案,每个解决方案包含一个主要项目和一个测试项目。换句话说,每个解决方案一个工作组件。
以前,当仅在我的本地计算机上工作时,我会在给定的解决方案中引用其中的几个 'library' 项目,因此链接的共享文件解决方案运行良好,例如<Assembly: AssemblyCompany("My Company")>
。这些属性之间的一致性对于注册表项命名等非常重要
但是现在将这些项目发送到构建服务器出现了问题;服务器上不存在链接文件,因此构建自然会失败。
我正在努力避免为我创建的每个新项目手动编辑 AssemblyInfo.vb
文件所带来的乏味和人为错误。链接是完美的,但现在不再有效。 (代码还需要在开发期间在本地 运行,因此不能在构建步骤中对其进行调整。)
我对源代码控制和构建体系结构比较陌生;那里的好人正在做什么来解决这个问题?
在构建项目时(在当前 repo 中),应该找到项目引用的所有程序集。
由于部分程序集不在当前repo中(在another/library repo中管理),而library repo与当前repo没有关系,所以你会错过library repo的程序集构建项目。
为了从库库中获取程序集,您应该在当前库和库库之间“添加关系”。通常使用两种方式:submodules and subtree.
选项 1:将库 repo 视为当前 repo 的子模块
主仓库可以从子模块仓库中获取特性,因此在从主仓库构建项目时可以使用库仓库的引用。使用的命令如下:
#In local current repo
git submodule add <URL for the library repo>
#change the reference path correspondingly
git add .
git commit -m 'add the library repo as submodule'
git push
现在构建项目可以从库 repo 中找到程序集。
选项 2:将库 repo 中的分支视为当前 repo 的子树
假设程序集在库回购的 master
分支中管理,因此您可以将库回购的 master 分支添加到当前回购:
# In local current repo
git subtree add --prefix=library <URL for the library repo> master
# change the reference path correspondingly
git add .
git commit -m 'add library master branch as subtree'
git push
现在项目也可以搭建成功了
事实证明解决方案非常简单。
方法如下:
- 在每个项目中,删除任何现有的 link 到
ServiceInfo.vb
- 将此命令插入到每个项目的预构建事件中
copy /y $(SolutionDir)..\ServiceInfo.vb $(SolutionDir)ServiceInfo.vb
- 构建每个项目复制文件
- 在每个项目中,link到
$(SolutionDir)ServiceInfo.vb
根据您的代码,第 3 步中的构建可能会失败,因为它找不到 ServiceInfo.vb
。没问题,在步骤 #4 中创建 link 后再次构建它。
这将确保 ServiceInfo.vb
包含在您的 Git 发布到 TFS 中,并且您在服务器上的构建步骤将成功。
我正在寻找一个优雅的解决方案(如果有的话)来解决链接到项目外共享程序集属性文件然后将该项目推送到 TFS 以进行构建的问题。
我正在将我所有的本地解决方案和项目转换为源代码管理(这已经很长时间了)并将共享代码发布为 NuGet 包。我的新设计强制每个包一个解决方案,每个解决方案包含一个主要项目和一个测试项目。换句话说,每个解决方案一个工作组件。
以前,当仅在我的本地计算机上工作时,我会在给定的解决方案中引用其中的几个 'library' 项目,因此链接的共享文件解决方案运行良好,例如<Assembly: AssemblyCompany("My Company")>
。这些属性之间的一致性对于注册表项命名等非常重要
但是现在将这些项目发送到构建服务器出现了问题;服务器上不存在链接文件,因此构建自然会失败。
我正在努力避免为我创建的每个新项目手动编辑 AssemblyInfo.vb
文件所带来的乏味和人为错误。链接是完美的,但现在不再有效。 (代码还需要在开发期间在本地 运行,因此不能在构建步骤中对其进行调整。)
我对源代码控制和构建体系结构比较陌生;那里的好人正在做什么来解决这个问题?
在构建项目时(在当前 repo 中),应该找到项目引用的所有程序集。
由于部分程序集不在当前repo中(在another/library repo中管理),而library repo与当前repo没有关系,所以你会错过library repo的程序集构建项目。
为了从库库中获取程序集,您应该在当前库和库库之间“添加关系”。通常使用两种方式:submodules and subtree.
选项 1:将库 repo 视为当前 repo 的子模块
主仓库可以从子模块仓库中获取特性,因此在从主仓库构建项目时可以使用库仓库的引用。使用的命令如下:
#In local current repo
git submodule add <URL for the library repo>
#change the reference path correspondingly
git add .
git commit -m 'add the library repo as submodule'
git push
现在构建项目可以从库 repo 中找到程序集。
选项 2:将库 repo 中的分支视为当前 repo 的子树
假设程序集在库回购的 master
分支中管理,因此您可以将库回购的 master 分支添加到当前回购:
# In local current repo
git subtree add --prefix=library <URL for the library repo> master
# change the reference path correspondingly
git add .
git commit -m 'add library master branch as subtree'
git push
现在项目也可以搭建成功了
事实证明解决方案非常简单。
方法如下:
- 在每个项目中,删除任何现有的 link 到
ServiceInfo.vb
- 将此命令插入到每个项目的预构建事件中
copy /y $(SolutionDir)..\ServiceInfo.vb $(SolutionDir)ServiceInfo.vb
- 构建每个项目复制文件
- 在每个项目中,link到
$(SolutionDir)ServiceInfo.vb
根据您的代码,第 3 步中的构建可能会失败,因为它找不到 ServiceInfo.vb
。没问题,在步骤 #4 中创建 link 后再次构建它。
这将确保 ServiceInfo.vb
包含在您的 Git 发布到 TFS 中,并且您在服务器上的构建步骤将成功。