Azure DevOps构建任务VSBuild复制了标记为copy=false的DLL。
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任务的行为有显著的差异?我在文档中没有找到关于这种行为的具体信息。
问题的原因是Azure DevOps构建任务中的VSBuild任务会复制被标记为"copy=false"的DLL文件。解决方法是在.csproj文件中添加一个名为"AfterBuild"的目标(Target),并在其中加入删除DLL文件的操作。如果删除操作无效,可以尝试在"AfterPublish"目标中进行删除操作。
下面是具体的解决方法:
1. 打开.csproj文件,可以使用文本编辑器进行编辑。
2. 在文件中找到一个适当的位置,在最后一个
3. 保存文件并关闭编辑器。
如果删除操作无效,可以尝试使用"AfterPublish"目标替代"AfterBuild"目标。在.csproj文件中添加以下代码块:
保存文件并关闭编辑器。
这样,在构建或发布过程中,被标记为"copy=false"的DLL文件将会被删除,避免复制到输出目录中。