【问题标题】:Infragistics components on build server构建服务器上的基础设施组件
【发布时间】:2011-01-05 12:00:49
【问题描述】:

我“继承”了一个新的(旧的?)Winforms 项目,并希望将它放到我们的构建服务器(Bamboo)上。该构建服务器仅安装了绝对最低版本(.NET 3.5,仅此而已),我们希望保持这种状态。

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

但是当我尝试在 Bamboo 上运行这个构建(使用 MSBuild)时,我不断收到错误:

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

经过一番谷歌搜索,项目中的那些licenses.licx 文件似乎是某种许可方案,以防止将工具安装在多台机器上。

但是我怎样才能摆脱这些,以便我的构建服务器构建能够工作,无需将完整的 Infragistics 组件集安装到构建服务器上(这不是选项)??

  • 如果我只是从项目中删除它们,构建可能会起作用(尚未尝试),但我的设计时间体验会受到影响/不起作用(两者中的哪一个?)
  • 保留这些文件以便我的设计时体验有效,从而阻止自动构建运行......

嗯.... 经典的 catch-22 - 有什么办法吗?

【问题讨论】:

    标签: licensing build-automation infragistics emptylicenseslicx licenseslicx


    【解决方案1】:

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

    • 在解决方案所在的文件夹中创建一个绝对空(0 字节长度)文件licenses.licx
    • 在构建的初始阶段,源代码是从我的源代码库中提取的
    • 时机成熟,就在构建开始之前,我将这个空的licenses.licx 复制到各个项目的Properties 目录中的所有现有licenses.licx

    有了这个,现在我的交互体验都可以工作了(因为存在正确的 licenses.licx 文件),但我的自动构建也没有中断(因为我复制了所有真实的空的 licenses.licx 文件不会导致构建中止)

    看起来有点骇人听闻 - 但它确实有效。希望有一天能对某人有所帮助。

    更新:我将此 BeforeBuild 步骤添加到我的 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 文件,我实际上有几个 &lt;Copy&gt; 任务来实现我的目标。

    【讨论】:

    • 我在同一条船上。您能解释一下您是如何将空的 licences.licx 文件复制到所有相关位置的吗?
    • @Philip Wallace:更新了我的帖子,详细展示了我是如何做到的 - 希望这会有所帮助!
    【解决方案2】:

    我们有其他公司的组件,但如果在第三方库中使用.Net licensing model,该方法应该可以工作。

    如果你有licenses.licx 文件,那么库可能使用.Net licensing model。在构建过程中,它使用lc.exe 实用程序构建二进制许可证文件,然后将其作为嵌入式资源包含在程序集中。

    你需要做什么:

    1. 使用 lc.exe 生成 YourApp.exe.licenses 文件。另一种方法是构建包含licenses.licx 的解决方案并从obj\Debugobj\Release 目录中获取它。此步骤应在安装和注册组件的机器上完成。在我们的例子中,它也可能需要输入许可证代码。
    2. 从项目中排除 licenses.licx。
    3. YourApp.exe.licenses 作为嵌入资源添加到项目中。
    4. 打开应用程序的 .csproj 并编辑 YourApp.exe.licenses 文件的条目。你会有这样的&lt;EmbeddedResource Include="YourApp.exe.licenses" /&gt;应该改成

      <EmbeddedResource Include="YourApp.exe.licenses" >
            <LogicalName>YourApp.exe.licenses</LogicalName>
      </EmbeddedResource>
      

      这是从资源名称中排除命名空间所必需的。

    5. 构建 - 检查 - 提交。

    我不确定 lc.exe 是如何工作的,但您可能需要不时重建 YourApp.exe.licenses 文件。

    【讨论】:

      【解决方案3】:

      我可以根据marc_s 的回答构建 Team City 项目,即用空白 licenses.licx 替换现有许可证文件。

      但是当我尝试在本地机器上打开具有基础设施控制的 aspx 页面时,出现了另一个问题,它给出了错误,因为我在本地机器上安装了基础设施,但我的 licenses.licx 是空白的。

      我找到了一个解决方法如下:

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

      <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>
      
      • 添加了 marc_s 提到的“BeforeBuild”目标,另外我还添加了一个条件,即当我的构建使用“CI_TeamCity_Build”而不是“Debug”或“Release”构建时将执行此任务

      • Team City 构建配置在“VS Solution Build Runner”步骤中使用上述配置。由于 csproj 文件中的“BeforeBuild”目标,它将许可证文件替换为空白文件并构建成功。

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

      【讨论】:

        【解决方案4】:

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

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

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

        最后,手动编辑项目文件添加 True 到每个引用。 (将 Copy Local 属性设置为 true 是不够的。)

        【讨论】:

          【解决方案5】:

          为了补充上述答案(即通过创建一个空的 licenses.licx 文件来解决问题),您可以安装 EmptyLicensesLicx nuget 包,它会在您的项目中生成一个空的 Licenses.licx,然后再编译它每次(这就是它工作所需要的全部)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-25
            • 1970-01-01
            • 2018-04-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-05
            • 1970-01-01
            相关资源
            最近更新 更多