能够在本地构建应用程序,但是当我尝试在azure devops管道中构建时。它显示以下错误
我已经安装了 EntityFramework 并在 webconfig 文件中添加了 system.data.entity.design 程序集。不走运
webapp\CaseDatabase.DataAccess\CaseAssignmentModule\CaseQueueDbAdapter.cs(10,19): Error CS0234: The type or namespace name 'Entity' does not exist in the namespace 'System.Data' (are you missing an assembly reference?)
webapp\CaseDatabase.DataAccess\CaseAssignmentModule\HoursEstDbAdapter.cs(4,19): Error CS0234: The type or namespace name 'Entity' does not exist in the namespace 'System.Data' (are you missing an assembly reference?)
webapp\CaseDatabase.DataAccess\CasesModule\CaseWorkflowDbAdapter.cs(2,17): Error CS0234: The type or namespace name 'EntityFrameworkCore' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
webapp\CaseDatabase.DataAccess\ClientsAndContactsModule\ContactDefaultsDbAdapter.cs(5,17): Error CS0234: The type or namespace name 'EntityFrameworkCore' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
webapp\CaseDatabase.DataAccess\ClientsAndContactsModule\InstructionLibraryDbAdapter.cs(4,17): Error CS0234: The type or namespace name 'EntityFrameworkCore' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
webapp\CaseDatabase.DataAccess\DBEntityCoreModel\CaseDatabaseContext.cs(2,17): Error CS0234: The type or namespace name 'EntityFrameworkCore' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
webapp\CaseDatabase.DataAccess\DBEntityCoreModel\ICaseDatabaseContext.cs(2,17): Error CS0234: The type or namespace name 'EntityFrameworkCore' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
webapp\CaseDatabase.DataAccess\DBEntityCoreModel\ICaseDatabaseContext.cs(3,17): Error CS0234: The type or namespace name 'EntityFrameworkCore' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
webapp\CaseDatabase.DataAccess\DBEntityCoreModel\ICaseDatabaseContext.cs(4,17): Error CS0234: The type or namespace name 'EntityFrameworkCore' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
webapp\CaseDatabase.DataAccess\EntityRepository.cs(4,17): Error CS0234: The type or namespace name 'EntityFrameworkCore' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
根据@Stella 分享的构建日志,此错误消息应该是由包恢复路径引起的。
首先通过
Nuget restore
任务恢复相关包全部成功。而且,所需的所有软件包都已恢复。它恢复的文件夹位置是 D:\a\1\s\webapp\Websites\packages
与 Nuget.config 中定义的位置相同 ..\packages
在
Visual Studio Build
日志中,有以下消息:
Considered "..\ThirdParty\NuGetPackages\EntityFramework.6.1.2\lib\net45\EntityFramework.dll", but it didn't exist.
***
***
Considered "..\ThirdParty\NuGetPackages\EntityFramework.6.1.2\lib\net45\EntityFramework.SqlServer.dll", but it didn't exist.
***
***
***
根据 Visual Studio Build 任务中显示的这些消息,您可以看到它正在文件夹路径下找到包位置
..\ThirdParty\NuGetPackages
。正常情况下,该路径由 <HintPath>... </HintPath>
控制。
现在,很容易知道导致的错误:构建期间找到的包位置与
Nuget restore
任务中实际包恢复的位置不匹配。
正常情况下,其默认位置应为
..\packages\...
,与Nuget.config
中定义的默认位置相同。我假设它的本地存储库路径应该被更改,那么在 HintPath
文件中定义的 csproj
也会自动更改。但是,在 Nuget.config 中,其包默认位置仍然保持默认。这将导致当包恢复时,它遵循Nuget.config
中定义的位置。但是在构建期间,由于它查找定义了 csproj
... 的包,因此构建无法知道实际包恢复的位置。然后导致这些错误消息。
要解决这个问题,有2个解决方案。
运行以下命令重新安装所有包,这样
HintPath
就可以全部更改为默认位置..\packages\...
,可以与Nuget.config中定义的同步。
Update-Package -reinstall
该解决方案的逻辑是撤销
HintPath
作为默认位置,从而可以与Nuget.config
中的定义保持同步。
执行命令后,
HintPath
应该看起来像这样:
Nuget.config
文件第二种解决方案的逻辑是修改Nuget.config
文件中的包位置定义。使其与
HintPath
同步,此时恢复的包的位置将与构建时包的位置相同。
将以下脚本添加到 Nuget.config 文件中:
<configuration>
<config>
<add key="repositoryPath" value="xxxx" />
</config>
...
</configuration>
只需尝试一种解决方案,然后在本地 Visual Studio 中构建。成功后,然后推送到Azure Devops中,使用之前相同的任务配置进行构建,
use nuget
,nuget restore
,VS build
,publish artifacts
。
希望这有帮助。
我刚刚经历了同样的问题,尽管我以与其他接受的答案不同的方式解决了它: 出现 CS0234 错误的项目的实体框架包是 6.4.0。查看包依赖项,它清楚地表明“.NETStandard,Version=2.1”,并且事实证明,该项目是.NET 2.0。将版本降级到 6.2.0 就是 DevOps Pipeline 最终成功所需的一切。
这看起来是一个“显而易见”的解决方案,但这个遗留解决方案有超过 100 个警告,而且由于它是在本地构建/运行的,它让整个团队困惑了几个小时。我希望这可以帮助其他人节省一些时间!