我有一个目标文件,该文件定义了在构建后移动文件的目标。在.NET Framework 4.7项目中导入时,它可以正常工作。但是,当将其导入.NET Core 2.1项目时,构建会在<Move>
上失败,并显示以下错误消息。
Error MSB3677: Unable to move file "bin/Debug/netcoreapp2.1/src/.addins" to "/addins/.addins". Access to the path "/addins" is denied. (MSB3677) (NetCore)
.targets文件
<?xml version="1.0" encoding="UTF-8" ?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<CopyDestPath>$(OutDir)/addins</CopyDestPath>
</PropertyGroup>
<Target Name="MoveFiles" AfterTargets="Build">
<ItemGroup>
<AddinFiles Include="$(OutDir)/src/.addins" />
</ItemGroup>
<Message Text="Moving files: @(OutputFiles)" />
<Move SourceFiles="@(AddinFiles)"
DestinationFolder="$(CopyDestPath)"
OverwriteReadOnlyFiles="true" />
</Target>
</Project>
文件
├── MSBuildHasOutDirEmpty.sln
├── NetCore
│ ├── NetCore.csproj
│ ├── build
│ │ └── MoveFiles.targets
│ └── src
│ ├── .addins
│ └── Class1.cs
└── NetFramework
├── NetFramework.csproj
├── build
│ └── MoveFiles.targets
└── src
├── .addins
├── MyClass.cs
└── Properties
└── AssemblyInfo.cs
此错误表示CopyDestPath
属性为/addins
,也意味着在定义$(OutDir)
属性时CopyDestPath
为空。
但是,当涉及到任务中$(OutDir)
中的<AddinFiles>
时,OutDir
属性具有一个值,因为错误消息显示了文件bin/Debug/netcoreapp2.1/src/.addins
的正确路径
因此,我在$(CopyDestPath)
中将$(OutDir)/addins
替换为<Move>
,如下所示,它在.NET Core项目构建中起作用。
<Move SourceFiles="@(AddinFiles)"
DestinationFolder="$(OutDir)/addins"
OverwriteReadOnlyFiles="true" />
但是问题是:
为什么在.NET Core构建中定义OutDir
属性时为空?
这是专门针对.NET Core构建的故意更改还是Bug?
顺便说一下,我使用的msbuild版本是Microsoft (R) Build Engine version 15.6.0.0 (xplat-master/ca830585 Sun Mar 25 19:24:09 EDT 2018) for Mono
。