Licensing 构建服务器上的基础设施组件
我“继承”了一个新的(旧的?)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 在谷歌搜索了一段时间后,项目中的那些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
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>