在构建部署或运行时更改SSIS脚本任务中引用的dll。

问题描述 投票:0回答:1

最近,我将我们所有的SSIS项目添加到一个持续集成管道中。这些项目在TeamCity中使用MSBuild构建,打包并推送到nuget feed。我们使用Octopus和一些建立在SQL服务器管理对象(SMO)上的手工制作的PowerShell来部署它们。除了一个项目之外,所有的工作都很正常。这个项目包含一些脚本任务,这些脚本任务引用了一个外部程序集。该程序集是在同一管道中构建的,其程序集版本号也会在部分过程中更新。问题在于SSIS项目现在引用了GAC中一个强命名的dll,而这个dll并不存在,因为版本号已经改变。

有谁知道有什么方法可以在CI服务器上构建时更新引用,或者在部署时覆盖版本号?

c# powershell ssis msbuild gac
1个回答
0
投票

我知道这个帖子已经很老了,但它已经被浏览了很多,所以这是我发现的一个解决方案。

你需要为构建包含一个 "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文件的项目,改变版本是通过改变你希望他们使用的版本文件夹的路径来完成的。

希望能帮到你?

© www.soinside.com 2019 - 2024. All rights reserved.