我有一个项目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机器上都可以得到它。
答案 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
答案 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目录进行点网发布时。
这对我来说很合理,希望它也能帮助其他人。