Licensing 构建服务器上的基础设施组件

Licensing 构建服务器上的基础设施组件,licensing,build-automation,infragistics,emptylicenseslicx,licenseslicx,Licensing,Build Automation,Infragistics,Emptylicenseslicx,Licenseslicx,我“继承”了一个新的(旧的?)Winforms项目,并希望将其放到我们的构建服务器(Bambol)上。该构建服务器只安装了绝对最小值(.NET 3.5,不多),我们希望保持这种状态 作为第一步,我将Infragistics组件的所有程序集文件(*.dll)提取到一个单独的目录中,并从该本地目录引用它们(而不是依赖于它们安装在GAC中)。工作正常 但是,当我尝试在Bambol上运行此构建(使用MSBuild)时,我不断遇到错误: Properties\licenses.licx(1):错误 LC0

我“继承”了一个新的(旧的?)Winforms项目,并希望将其放到我们的构建服务器(Bambol)上。该构建服务器只安装了绝对最小值(.NET 3.5,不多),我们希望保持这种状态

作为第一步,我将Infragistics组件的所有程序集文件(*.dll)提取到一个单独的目录中,并从该本地目录引用它们(而不是依赖于它们安装在GAC中)。工作正常

但是,当我尝试在Bambol上运行此构建(使用MSBuild)时,我不断遇到错误:

Properties\licenses.licx(1):错误 LC0004:创建时发生异常 类型 'Infragistics.Win.UltraWinToolbars.UltraToolbarsManager, Infragistics2.Win.UltraWinToolbar.v7.2, 版本=7.2.20072.61,区域性=中性, PublicKeyToken=7dd5c3163f2cd0cb' System.ComponentModel.LicenseException

在谷歌搜索了一段时间后,项目中的那些
licenses.licx
文件似乎是某种许可方案,以防止这些工具安装在多台机器上

但是,如果不在构建服务器上安装完整的基础设施组件集(这是而不是一个选项),我如何摆脱这些组件以使构建服务器构建工作

  • 如果我只是从项目中删除它们,构建可能会工作(还没有尝试过),但是我的设计时经验会受到影响/不工作(这两个中的哪一个?)
  • 有文件在身边,这样我的设计时经验就可以防止自动构建运行通过

嗯。。。。经典的第22条军规-有什么办法可以解决这个问题吗

我发现解决这个问题的唯一方法是:

  • 在解决方案所在的我的文件夹中创建一个绝对空(0字节长)的文件
    licenses.licx
  • 在构建的初始阶段,将从我的源代码存储库中提取源代码
  • 当时间到来时,就在构建开始之前,我将这个空的
    licenses.licx
    复制到各个项目的
    属性
    目录中的所有现有
    licenses.licx
有了这个,我现在有了我的交互体验(因为有了正确的
许可证.licx
文件),但是我的自动构建也没有中断(因为我复制的所有真实的
许可证.licx
文件都是空的,不会导致构建中的任何中止)

看起来有点像黑客,但它确实有效。希望这有助于某人,某地,某天

更新:我在MSBuild生成文件中添加了此
生成前
步骤,以将空的
*.licx
文件复制到我需要的位置:

<Target Name="BeforeBuild">
   <CreateItem Include="licenses.licx">
       <Output TaskParameter="Include" ItemName="EmptyLicensesLicx" />
   </CreateItem>

   <Copy SourceFiles="@(EmptyLicensesLicx)" 
         DestinationFolder="(your-target-folder-here)" 
         ContinueOnError="true" />

</Target>

因为我需要在几个地方替换这个*.licx文件,所以我实际上有几个
任务来实现我的目标。

我们有其他公司的组件,但是如果在第三方库中使用,这种方法应该可以用

若您有
licenses.licx
文件,那个么库可能会使用。在构建过程中,它使用实用程序构建二进制许可证文件,然后将其作为嵌入式资源包含在程序集中

您需要做的是:

  • 使用lc.exe生成
    YourApp.exe.licenses
    文件。另一种方法是构建包含
    licenses.licx
    的解决方案,并从
    obj\Debug
    obj\Release
    目录获取它。此步骤应在安装和注册组件的机器上完成。此外,它可能需要输入许可证代码,就像我们的情况一样
  • 从项目中排除licenses.licx
  • YourApp.exe.licenses
    作为嵌入式资源添加到项目中
  • 打开应用程序的.csproj并编辑
    YourApp.exe.licenses
    文件的条目。您将有这样的内容
    ,应该将其更改为

    <EmbeddedResource Include="YourApp.exe.licenses" >
          <LogicalName>YourApp.exe.licenses</LogicalName>
    </EmbeddedResource>
    
    
    YourApp.exe.licenses
    
    这是从资源名称中排除名称空间所必需的

  • 构建-检查-提交
    我不确定lc.exe如何工作,但您可能需要不时重建
    YourApp.exe.licenses
    文件

    我可以基于的答案构建团队城市项目,即用空白licenses.licx替换现有许可文件

    但当我试图打开本地机器上有infragistics控件的aspx页面时,出现了另一个问题,它给出了错误,因为我在本地机器上安装了infragistics,但我的licenses.licx是空白的

    我找到了如下解决方法:

    • 在Visual Studio中创建了一个新配置,专门用于在Team City中构建项目

    
    
    • 添加了marc_提到的“BeforeBuild”目标。此外,我还添加了一个条件,即当我的构建使用“CI_TeamCity_build”时,将执行此任务,而不是“调试”或“发布”构建

    • Team City构建配置正在“VS解决方案构建运行程序”步骤中使用上述配置。由于csproj文件中的“BeforeBuild”目标,它将许可证文件替换为空白文件,生成成功

    • 在我的本地计算机上,我继续使用“调试”或“发布”版本,因为它不会将licenses.licx文件替换为空白文件。所有infragistics控件都显示在.aspx页面上,没有任何问题


    我最近使用TeamCity 9.1作为构建服务器时遇到了这个问题

    最初设置构建服务器时,我们不想在计算机上安装Infragistics,因此我们创建了一个References文件夹,在其中复制所需的程序集并将其签入。(我知道这是不可取的,但这是一个解决办法。)

    确保项目引用新路径上的程序集。这将在项目文件中为每个部件创建一个HintPath条目

    最后,手动编辑项目文件以添加 对每个引用都是真实的。(仅设置副本Loca是不够的
    <Target Name="BeforeBuild" Condition="$(Configuration)==CI_TeamCity_Build">
        <CreateItem Include="$(MSBuildProjectDirectory)\licenses.licx">
          <Output TaskParameter="Include" ItemName="EmptyLicensesLicx" />
        </CreateItem>
        <Copy SourceFiles="@(EmptyLicensesLicx)" DestinationFolder="$(MSBuildProjectDirectory)\Properties\" ContinueOnError="true" />
    </Target>