最近,我将我们所有的SSIS项目添加到一个持续集成管道中。这些项目在TeamCity中使用MSBuild构建,打包并推送到nuget feed。我们使用Octopus和一些建立在SQL服务器管理对象(SMO)上的手工制作的PowerShell来部署它们。除了一个项目之外,所有的工作都很正常。这个项目包含一些脚本任务,这些脚本任务引用了一个外部程序集。该程序集是在同一管道中构建的,其程序集版本号也会在部分过程中更新。问题在于SSIS项目现在引用了GAC中一个强命名的dll,而这个dll并不存在,因为版本号已经改变。
有谁知道有什么方法可以在CI服务器上构建时更新引用,或者在部署时覆盖版本号?
我知道这个帖子已经很老了,但它已经被浏览了很多,所以这是我发现的一个解决方案。
你需要为构建包含一个 "target "文件。
下面是一个Targets文件的例子。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<E10BOs>C:\Integrations\E10 Uplifts\Epicor 10.2.600.3</E10BOs>
</PropertyGroup>
<Target Name="BeforeResolveReferences">
<CreateProperty Value="$(E10BOs);$(AssemblySearchPaths)">
<Output TaskParameter="Value" PropertyName="AssemblySearchPaths" />
</CreateProperty>
</Target>
</Project>
属性组E10BOS(可以有多个),然后定义你要构建的版本的dll的路径。
它需要保存为myTargetsFile.target。
然后,在一个常规的VS项目中,你可以在项目文件中添加这一行(在VS外部的记事本中)。
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), myTargetsFile.targets))\myTargetsFile.targets" />
</Project>
它使用GetDirectoryNameOfFileAbove来搜索文件夹树,直到它找到你的目标文件,然后导入它。 如果你有很多不同的项目都需要改变版本,而你又不需要找出任何相对的路径,那就非常有用。
然而,在SSIS中,这似乎并不奏效。需要做的是在包中的.dtsx文件中硬连接到target文件的路径,再次在记事本中编辑它,并添加以下一行(你可能会看到csharp条目靠近项目标签的末尾,就像之前一样。
<Import Project="C:\Integrations\E10 Uplifts\Epicor 10.2.600.3\myTargetsFile.targets" />
这将把项目引用的信息传递到脚本中。
然后,对于所有使用target文件的项目,改变版本是通过改变你希望他们使用的版本文件夹的路径来完成的。
希望能帮到你?