используя пакет nuget docfx.console в linux - PullRequest
2 голосов
/ 04 февраля 2020

На данный момент у меня есть проект Visual Studio, и я использую пакет nuget docfx.console для создания документации, и все работает нормально и, как и ожидалось ... на windows. Суть в том, что теперь я хочу сделать docker изображение на основе mcr.microsoft.com/dotnet/core/sdk:3.1, которое основано на linux изображении. И скомпилируя в этом docker образе, выполнив команду:

dotnet publish -c Release -o out

Дает следующую ошибку

 > [build 9/9] RUN dotnet publish -c Release -o out:
#22 1.080 Microsoft (R) Build Engine version 16.0.450+ga8dc7f1d34 for .NET Core
#22 1.080 Copyright (C) Microsoft Corporation. All rights reserved.
#22 1.080
#22 2.852   Restore completed in 215.94 ms for /app/Documentation/Documentation.csproj.
#22 6.299   Documentation -> /app/Documentation/bin/Release/netcoreapp2.1/Documentation.dll
#22 6.402   /bin/sh: 2: /tmp/tmpbd72ebbe5e6b49c1b3244f1f50c8b57a.exec.cmd: /root/.nuget/packages/docfx.console/2.48.1/build/../tools/docfx.exe: Exec format error
#22 6.407 /root/.nuget/packages/docfx.console/2.48.1/build/docfx.console.targets(57,5): error MSB3073: The command ""/root/.nuget/packages/docfx.console/2.48.1/build/../tools/docfx.exe" "/app/Documentation/docfx.json" -o "" -l "log.txt" --logLevel "Verbose"" exited with code 2. [/app/Documentation/Documentation.csproj]

Я уже немного подтрунивал и считаю, что проблема в основном решена. Запуск file на console.exe показывает, что это PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows. И файлы такого типа не должны выполняться на linux с использованием sh, а с mono. И действительно работает:

mono docfx.exe "/app/Documentation/docfx.json" -o "" -l "log.txt" --logLevel "Verbose"

строит документацию так же хорошо, как и ожидалось. На данный момент, конечно, у меня есть куча обходных путей для правильного построения документации, просто удалите docfx.console из csproj и соберите его вручную из командной строки, используя команду docker.

Но вопрос могу ли я также использовать пакет nuget на linux, изменив способ запуска команды docfx.exe пакетом nuget? Или это возможно только путем фактического исправления этого в docfx.console?

ps, в случае, если это имеет значение, используемая мной версия docfx.console является самой последней, доступной на момент написания, а именно 2.48 .1

1 Ответ

1 голос
/ 30 апреля 2020

Но вопрос в том, могу ли я также использовать пакет nuget на linux, изменив способ запуска команды docfx.exe пакетом nuget? Или это возможно только путем фактического исправления этого в docfx.console?

Создать скрипт docfx, который запускает docfx.exe с использованием Mono, например, вот так (при условии, что docfx.exe находится в /opt/docfx/docfx.exe):

echo '#!/bin/bash\nmono /opt/docfx/docfx.exe $@' > /usr/bin/docfx && chmod +x /usr/bin/docfx

Затем передайте параметр MSBuild BuildDocToolPath с путем к этому сценарию, например, так:

dotnet publish -c Release -o out -p:BuildDocToolPath=/usr/bin/docfx

docfx.console будет использовать этот путь для выполнения DocFX. Я думаю, что свойство BuildDocToolPath нигде не задокументировано, но вы можете увидеть его в исходном коде .

...