6

我有一个Project.Api引用另一个项目的项目Project.DomainModel。当我通过运行构建 API 项目以进行发布时

dotnet restore && dotnet build -c Release

它构建成功。但是,当我尝试发布

 dotnet publish -c Release -o published --no-restore --no-build ./Project.Api

我收到此错误:

/usr/local/share/dotnet/sdk/2.1.302/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Publish.targets(168,5): error MSB3030: Could not copy the file "xxxx/Project.DomainModels/bin/Debug/netcoreapp2.1/Project.DomainModels.dll" because it was not found. [xxxx/Project.Api/Project.Api.csproj]

根据报错,它是在目录中寻找被引用的项目Debug,但是它当然不会在那里找到它,因为它会在Release目录中。

Project.Api.csproj文件如下所示:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="AutoMapper" Version="8.0.0" />
  </ItemGroup>
  <ItemGroup>
      <ProjectReference Include="..\Project.DomainModels\Project.DomainModels.csproj" />
  </ItemGroup>
</Project>

知道为什么它在 Debug 目录而不是 Release 中查找吗?在 Mac 和 linux 机器上都可以使用它。

4

2 回答 2

5

您的错误是--no-build,使用此标志您不会让 dotnet 来创建项目的引用 dll 文件。

发布失败:

dotnet publish -c Release -o published --no-restore --no-build .\App\

CSC : error CS0006: Metadata file 'C:\Path\App.Domain\bin\Release\netstandard2.0\App.Domain.dll' could not be found [C:\Path\App\App.csproj]

成功发布:

dotnet publish -c Release -o published --no-restore  .\App\

 App.Domain -> C:\Path\App.Domain\bin\Release\netstandard2.0\App.Domain.dll
 App -> C:\Path\App\bin\Release\netcoreapp2.1\App.dll
 App -> C:\Path\App\bin\Release\netcoreapp2.1\App.Views.dll
 App -> C:\Path\App\published\

答案样本dotnet --info

.NET Core SDK (reflecting any global.json):
 Version:   2.1.500
 Commit:    b68b931422

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.17763
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\2.1.500\

Host (useful for support):
  Version: 3.0.0-preview-27122-01
  Commit:  00c5c8bc40

阅读有关MSBuild的更多信息,我希望这个答案可以帮助您更好地了解 dotnet 构建过程。

于 2018-12-11T14:45:44.590 回答
4

tl;dr创建一个具有<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>属性的发布发布配置文件,并在 dotnet publish 命令中指定发布配置文件,即

dotnet publish -c Release /p:PublishProfile=Release -o published --no-restore --no-build ./Project.Api

我知道这是一个老问题,但万一其他人遇到它,我也遇到了类似的问题,在我的情况下,解决方案是确保我有一个发布发布配置文件,或者如果我没有创建一个。发布配置文件包含一个值为 Release 的 LastUsedBuildConfiguration 属性,这似乎是关键问题。

本质上,dotnet publish -c Release说我们构建然后发布发布构建配置。当我们还指定 --no-build 时,我们说的是跳过构建步骤。因此,我们指定要使用的构建配置,然后告诉它不要构建。

输入 LastUsedBuildConfiguration 属性。此属性可以在发布配置文件中设置,也可以由 MSBuild 在构建步骤中动态设置。我还没有深入研究 SDK,但这就是我怀疑正在发生的事情。由于我们跳过了构建步骤,因此未设置 LastUsedBuildConfiguration,因此无法用于 dotnet publish。在这种情况下,dotnet publish 采用其默认构建配置,即 Debug。

为了测试这一点,我运行了以下 dotnet publish 命令:

当我运行此命令时,它会在 bin/Debug 中查找(未指定 PublishProfile):

dotnet publish -c Release --no-restore --no-build

当我运行此命令时,它会在 bin/Debug(PublishProfile,但没有 -c Release)中查找:

dotnet publish --no-restore --no-build /p:PublishProfile=Release

当我运行这个命令时,它最终会在 bin/Release(-c Release 和 PublishProfile)中查找:

dotnet publish -c Release --no-restore --no-build /p:PublishProfile=Release

仅在最后一种情况下,当 -c Release 和 /p:PublishProfile=Release 都使用 bin/Release 目录进行 dotnet 发布时。

这是为我整理的,希望它也可以帮助其他人。

于 2020-02-18T18:33:55.473 回答