在 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.
目前我有一个 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.