在 linux 上使用 docfx.console nuget 包

using the docfx.console nuget package on linux

目前我有一个 visual studio 项目,我使用 docfx.console nuget 包来构建文档,并且一切正常,正如预期的那样...在 windows 上。现在的重点是我想制作一个基于 mcr.microsoft.com/dotnet/core/sdk:3.1 的 docker 图像,它基于 linux 图像。并在此 docker 图像中编译 运行ning 命令:

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 on console.exe 表明这是一个 PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows。这类文件不应在 linux 上使用 sh 执行,而应使用 mono 执行。事实上 运行ning:

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

按预期构建文档。在这一点上,当然我有一堆解决方法来正确构建文档,只需从 csproj 中删除 docfx.console 并使用 docker 命令从命令行手动构建它。

但问题是,我是否也可以通过更改 docfx.exe 命令由 nuget 包 运行 的方式来在 linux 上使用 nuget 包?或者只有在 docfx.console?

中实际解决这个问题才有可能

p.s。以防万一,我使用的 docfx.console 版本是撰写本文时可用的最新版本,即 2.48.1

But the question is, can I also use the nuget package on linux by changing how the docfx.exe command is run by the nuget package? Or is this only possible by actually fixing this in docfx.console?

创建使用 Mono 运行 docfx.exe 的脚本 docfx,例如,像这样(假设 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 没有在任何地方记录,但你可以 see it in source code.