Azure DevOps构建任务VSBuild复制了标记为copy=false的DLL。

14 浏览
0 Comments

Azure DevOps构建任务VSBuild复制了标记为copy=false的DLL。

我目前正在尝试使用.NET Framework 4.8和Oracle在Azure DevOps中创建一个CD流水线。不幸的是,我无法运行它;因为DLL Oracle.DataAccess在GAC中,我需要确保构建流水线不将其打包,否则会出现错误:

无法加载文件或程序集'Oracle.DataAccess, Version=4.121.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342'或其某个依赖项。定位的程序集清单定义与程序集引用不匹配。(HRESULT 异常: 0x80131040)

现在,有趣的是:为了使其在本地工作,我将Oracle.DataAccess DLL复制到了一个本地文件夹,但是使用 "Copy Local = False" 进行引用:

    
      False
      ..\..\librairies\Oracle.DataAccess.dll
      False
    

现在,当在本地编译时,一切都很好,DLL不会被复制到本地,但是当我在Azure DevOps上构建时,最终包中总是会包含这个DLL,并且我看到以下日志条目:

_CopyFilesMarkedCopyLocal: 正在从"C:...\19.0.0\client_1\odp.net\bin\4\Oracle.DataAccess.dll"复制文件到"Path\bin\Release\Oracle.DataAccess.dll"。

Azure DevOps的YAML如下所示:

variables:

solution: 'src/**/*.sln'

buildPlatform: 'Any CPU'

buildConfiguration: 'Release'

steps:

...

- task: VSBuild@1

displayName: 'Build solution'

inputs:

solution: '$(solution)'

vsVersion: '16.0'

msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'

platform: '$(buildPlatform)'

configuration: '$(buildConfiguration)'

msbuildArchitecture: 'x64'

createLogFile: true

通过TotalCmd和类似工具进行检查,我在代码库中没有看到任何对Oracle.DataAccess DLL的隐藏依赖。看起来像是VSBuild任务似乎总是要复制该文件,尽管我说它不应该这样做。我是否有所遗漏?或者VSBuild任务的行为有显著的差异?我在文档中没有找到关于这种行为的具体信息。

0
0 Comments

问题的原因是Azure DevOps的构建任务VSBuild在复制DLL文件时,无论是否将其标记为copy=false,都会复制该文件。解决方法是直接在主机程序集中配置引用的程序集,将SpecificVersion设置为False,将HintPath设置为正确的DLL路径,将Private设置为False,这样发布过程将不会复制该程序集。这可能是任务的一个bug,因为在本地发布时不会复制该程序集,而且我认为,对于具有copy=false的临时依赖项也应该遵守这一规则。此外,在主机程序集(如Web API)中引用数据访问程序集并不是一种良好的关注点分离方法。

0
0 Comments

问题的原因是Azure DevOps构建任务中的VSBuild任务会复制被标记为"copy=false"的DLL文件。解决方法是在.csproj文件中添加一个名为"AfterBuild"的目标(Target),并在其中加入删除DLL文件的操作。如果删除操作无效,可以尝试在"AfterPublish"目标中进行删除操作。

下面是具体的解决方法:

1. 打开.csproj文件,可以使用文本编辑器进行编辑。

2. 在文件中找到一个适当的位置,在最后一个标签的上方插入以下代码块:


  

3. 保存文件并关闭编辑器。

如果删除操作无效,可以尝试使用"AfterPublish"目标替代"AfterBuild"目标。在.csproj文件中添加以下代码块:


  

保存文件并关闭编辑器。

这样,在构建或发布过程中,被标记为"copy=false"的DLL文件将会被删除,避免复制到输出目录中。

0