在.NET Core构建中定义属性时未设置OutDir

时间:2018-08-04 21:42:33

标签: msbuild-task

我有一个目标文件,该文件定义了在构建后移动文件的目标。在.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

0 个答案:

没有答案