Estamos tratando de conectarnos a una base de datos MySQL a través de .NET Core. Todo funciona localmente, pero en nuestro servidor donde se está ejecutando gitlab-ci falla la construcción. Por lo tanto, falla la construcción.

Se produjo el error: error NU1001: The dependency MySql.Data >= 7.0.6-IR31 could not be resolved. Esto es extraño ya que funciona en nuestras máquinas locales, pero no en el CI que se ejecuta en Docker.

Ejecutar dotnet restore y dotnet run funciona localmente. dotnet restore también funciona en el servidor y puede ver que el paquete MySql.Data está instalado. Sin embargo, al ejecutar las pruebas unitarias, se rompe porque la dependencia no se pudo resolver. Tal vez no es compatible con Linux?

¿Qué estamos haciendo mal?

El archivo project.json:

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Mvc": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.0.0",
    "Microsoft.Extensions.Configuration": "1.0.0",
    "Microsoft.Extensions.Configuration.CommandLine": "1.0.0",
    "Microsoft.Extensions.Configuration.Binder": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.EntityFrameworkCore": "1.0.0",
    "DotNetAirbrake": "1.0.33",
    "Geitenbelang.AnimalManager.Api.Models": "1.0.0-*",
    "Geitenbelang.AnimalManager.Api.Database": "1.0.0-*",
    "AutoMapper": "5.1.1",
    "MySql.Data.EntityFrameworkCore": "7.0.6-IR31"
  },

  "frameworks": {
    "netcoreapp1.0": {}
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "Areas/**/Views",
      "appsettings.json",
      "web.config"
    ]
  }
}
0
Baklap4 23 dic. 2016 a las 18:02

3 respuestas

La mejor respuesta

Además de Lajos Arpad, sentí curiosidad e investigé un poco. Parece que al instalar dependencias en Windows guarda el paquete nuget en la siguiente ruta: packages\MySql.Data.EntityFrameworkCore\7.0.6-IR31

En Linux, por otro lado, instala el paquete en esta ruta: packages\MySql.Data.EntityFrameworkCore\7.0.6-ir31

Como se declara en el archivo nuspec de MySql.Data.EntityFrameworkCore, la versión se define como 7.0.6-IR31

A medida que restauro los paquetes con el comando dotnet restore puedo concluir que dotnet restore está haciendo algo extraño con respecto a la restauración. Cambiar la versión en el archivo nuspec en Linux a 7.0.6-ir31 resolvió mi problema. Como esto es un error (no respetando las mayúsculas en la versión), voy a completar un informe de error.

Enlace al informe de errores: https://github.com/dotnet/cli/issues/5155

3
Baklap4 27 dic. 2016 a las 11:55

Recientemente tuve un problema similar con otra dependencia. Después de un largo proceso de tortura, me di cuenta de que la dependencia debe instalarse a través de un instalador, o si eso no es posible en su caso, entonces puede copiar. Aquí puede obtener el paquete y la información si aún no está instalado en el servidor: https://www.nuget.org/packages/MySql.Data.EntityFrameworkCore/7.0.6-IR31.

En esta carpeta

c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\

Tiene varias carpetas con .NET Frameworks. Debe asegurarse de que los archivos dll y xml que necesita estén allí.

1
Lajos Arpad 23 dic. 2016 a las 18:04

Me encontré exactamente con el mismo problema con el mismo paquete (funciona bien en mi máquina Windows localmente, falla cuando Jenkins ejecuta dotnet restore y dotnet build en un contenedor acoplable). Siguiendo la respuesta de Baklap4, como parte del dockerfile agregué la siguiente línea

RUN echo "{ \"packages\": \"packages\" }" >> global.json

En combinación con

RUN dotnet restore --packages "packages"

Resultando en la restauración de todos los paquetes en la carpeta de "paquetes" del contenedor, y todos los proyectos dentro de saber buscarlos en esa carpeta. Una vez que sepa dónde están los paquetes, puedo ejecutar

RUN mv MySql.Data/7.0.6-ir31 MySql.Data/7.0.6-IR31
RUN mv MySql.Data.EntityFrameworkCore/7.0.6-ir31   MySql.Data.EntityFrameworkCore/7.0.6-IR31

Cambiar el nombre de esas carpetas a mayúsculas.

0
Bokoskokos 7 feb. 2017 a las 13:28