我有一个Common.dll,它被(远远超过)两个SharePoint包共享/使用,被部署到单个SharePoint实例使用的同一个GAC。共享程序集从产品部署演变为产品部署,并且它本身并不被视为产品。它本身并未发布。它仅在其他SharePoint产品/包的上下文中发展。
通用程序集主要只是高度可重用代码的存储库。它仅由一小部分内部开发人员使用。
分支/合并允许各种产品在适合开发人员的情况下使用最新版本的Common.dll。每个产品的开发工作都会计划承担新版Common.dll的风险。
我需要让这些程序集在产品与产品之间隔离开来 - 从SharePoint包到SharePoint包。
但那并没有发生。相反,每次部署时,都会在GAC中覆盖Common.dll,以便使用它的所有产品都会收到此最新版本的Common.dll的行为。根据行为的不同,它可能会破坏一段时间内未部署的产品。
我正试图阻止该部署“惊喜!”潜在的,不必像对待公共产品一样对待Common.dll,必须小心避免破坏更改等。
在将各种SharePoint包部署到单个SharePoint实例的GAC时,您使用什么技术来保留不同版本的通用程序集?
答案 0 :(得分:0)
我们在公共程序集的Visual Studio项目的预构建事件中使用此命令:
if not "$(SolutionName)" == "ABC" if not "$(TargetFileName)" == "$(ProjectName).$(SolutionName).dll" exit 1
此预构建命令不必随着各种产品使用公共程序集而更改。将“ABC”替换为通用程序集的解决方案文件的名称时,它的内容如下:
如果我们在自己的解决方案中编译通用程序集(这很少见,但它发生了),那就是 无需考虑 - 编译!否则,除非有人,否则无法构建 根据消费产品的Visual Studio重命名了通用程序集 解决方案文件名。
为了避免构建失败,我们在将公共程序集分支到消费产品的代码库(通过通用程序集项目的属性页面)之后重命名它。公共程序集的项目 name 在解决方案资源管理器中未进行 更改,其“默认名称空间”也未在其“属性页”中更改。只有“程序集名称”更改。因此,除了已经进行的特定于产品的更改之外,维护和使用公共代码总是让人感到熟悉:无论您正在开发哪种产品,解决方案资源管理器和命名空间都保持不变。
重命名会更改公共程序集的项目文件中的一行,这会在您合并回主干时产生摩擦(和/或稍后,当您将主干 out 合并回其他产品时)
如果公共项目文件进入ProductB的代码库,同时仍为ProductA命名其程序集,则其预构建命令将阻止在ProductB中进行编译,其中开发人员可以轻松地更改允许编译的“程序集名称”。这种摩擦机会越多,合并就越多。
每次新的SharePoint产品到达GAC时,通用程序集都会在GAC中获取唯一的名称(和实例)。各种产品可以使用,发展和部署通用组件,而不必担心在部署时突然破坏其他产品/包。
答案 1 :(得分:0)
版本控制和binding redirects可以在这里提供帮助。根本问题似乎是Visual Studio缺乏对强名称的一致标记化。创建一个可以更新给定项目文件中所有常见程序集引用的简单工具可能更好,而不是创建涉及源代码控制的详细解决方案。这解决了根本问题,而没有产生其他不必要的成本。