Ошибка компиляции C #: не удается найти основной файл * .csproj - PullRequest
1 голос
/ 07 июня 2019

Я получил проект C # / Docker от коллеги и должен использовать его со своим собственным сервисом.Это REST API.Мой коллега использовал Visual Studio Community 2019 для этого.Теперь я хочу запустить его на машине с установленным докером.Есть файл докера.Когда я запускаю сборку Docker, я получаю сообщение об ошибке, что в файле * .csproj не указан основной метод.Поэтому я указал объект запуска в файле csproj.Раньше этого не было.

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
    <StartupObject>Program</StartupObject> // <-- I added this line nothing else
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" />
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.4.10" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.9" />
  </ItemGroup>

</Project>

Но я все равно получаю сообщение об ошибке при запуске сборки Docker:

user@notebook:~/Schreibtisch/DeviceApi/DeviceApi$ sudo docker build -t deviceApi .
[...]
CSC : error CS1555: Could not find 'Program' specified for Main method [/src/DeviceApi/DeviceApi.csproj]

Структура проекта следующая.Существует каталог с именем DeviceApi.Это мой рабочий каталог (как вы можете видеть из моей командной строки aboce).В этом каталоге находятся эти файлы рядом с другими файлами проекта: Dockerfile, DeviceApi.csproj, Program.cs (который содержит метод main)

user@notebook:~/Schreibtisch/DeviceApi/DeviceApi$ ls
appsettings.Development.json  DeviceApi.csproj             Program.cs
appsettings.json              DeviceApi.csproj.user        Properties
bin                           Handler                      ResponseFilter
Controllers                   Startup.cs                   DBManager
Models                        Util                         Dockerfile
obj                           wwwroot

Вот содержимое файла Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build
WORKDIR /src
COPY ["DeviceApi.csproj", "DeviceApi/"]
RUN dotnet restore "DeviceApi/DeviceApi.csproj"
COPY . .
WORKDIR "/src/DeviceApi"
RUN dotnet build "DeviceApi.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "DeviceApi.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "DeviceApi.dll"]

Вот содержимое Program.cs:

namespace DeviceApi
{
    public class Program
    {

        public static ILogger<Program> LOGGER = null;
        public static IConfiguration CONF = null;
        public static void Main(string[] args)
        {
            var host = CreateWebHostBuilder(args).Build();
            LOGGER = host.Services.GetRequiredService<ILogger<Program>>();
            CONF = Startup.Configuration;
            host.Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) => [...] ;
    }
}

Мой коллега использовал Visual Studio для этого.Я не использовал C # раньше, и у меня мало опыта работы с Visual Studio.Я думаю / надеюсь, что на моей стороне небольшая ошибка пользователя, но я не знаю, что я сделал не так.

Спасибо за ваши усилия.

1 Ответ

0 голосов
/ 26 июня 2019

Я только что решил проблему, хотя меня это немного смущает.В основном я удалил подкаталоги из файла Docker.

Я отредактировал файл Docker следующим образом:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build
WORKDIR /src
COPY ["DeviceApi.csproj", "./"]
RUN dotnet restore "DeviceApi.csproj"
COPY . .
WORKDIR "/src/"
RUN dotnet build "DeviceApi.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "DeviceApi.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "DeviceApi.dll"]

Я все еще немного сбит с толку, поскольку файлы dockerfile и csproj были автоматически сгенерированы Visual Studio.Я не знаю, как Visual Studio действует по-другому по отношению к Docker, чем я на моей машине Linux.Теперь это работает, но я снова ожидаю проблем при фиксации этих изменений для других (которые снова будут использовать Visual Studio).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...