Dotnet在Debug目录而不是Release

时间:2018-12-11 08:33:14

标签: c# asp.net-core dotnet-publish

我有一个项目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机器上都可以得到它。

2 个答案:

答案 0 :(得分:3)

您的错误是--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,希望这个answer可以帮助您更好地低估dotnet的构建过程。

答案 1 :(得分:3)

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

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

我知道这是一个老问题,但是如果其他任何人遇到这个问题,我也会遇到类似的问题,而就我而言,解决方案是确保我拥有一个Release publish概要文件,或者如果有的话创建一​​个不。发布配置文件包含一个LastUsedBuildConfiguration属性,其值为Release,这似乎是关键问题。

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

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

要对此进行测试,我运行了以下dotnet发布命令:

当我运行此命令时,它将在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目录进行点网发布时。

这对我来说很合理,希望它也能帮助其他人。