如何通过MsBuild将所有json文件复制到新文件夹?

时间:2018-07-31 13:31:01

标签: msbuild .net-core

复制步骤 在Windows上,使用此命令可以正常工作:

<PropertyGroup>
    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
    <PreBuildEvent>IF NOT EXIST "$(TargetDir)DataFiles" MKDIR "$(TargetDir)DataFiles"</PreBuildEvent>
    <PostBuildEvent>FOR /R "$(SolutionDir)\Api.Tests\Scenarios" %25%25f IN (*.json) DO COPY "%25%25f" "$(TargetDir)DataFiles\" /Y</PostBuildEvent>

  </PropertyGroup>

在linux上,我有这种错误

Build FAILED.
[12:44:39][Step 1/1] 
[12:44:39][Step 1/1] /usr/share/dotnet/sdk/2.1.302/Microsoft.Common.CurrentVersion.targets(1331,5): error MSB3073: The command "IF NOT EXIST "DataFiles" MKDIR "DataFiles"" exited with code 127. [/opt/jetbrains/buildAgent/work/4fc9032bf5656724/Api.Tests/Api.Tests/Api.Tests.csproj]
[12:44:39][Step 1/1]     0 Warning(s)
[12:44:39][Step 1/1]     1 Error(s)

2 个答案:

答案 0 :(得分:1)

您的构建后事件使用CMD.EXE特定代码-也称为(Windows)BATCH命令。换句话说,它是特定于平台的。

最好的方法是使用MSBuild内置功能来复制文件:

  • 删除PreBuildEvent和PostBuildEvents属性
  • 在您的项目文件的“ Project”标签中添加以下内容(最后最好)。

    <PropertyGroup>
       <BuildDependsOn>
       $(BuildDependsOn);_CopyAuxFiles
       </BuildDependsOn>
    </PropertyGroup>
    
    <Target Name="_CopyAuxFiles">
        <MakeDir Directories="$(TargetDir)DataFiles"/>
        <ItemGroup>
           <Files Include="$(SolutionDir)\Api.Tests\Scenarios\*.json"/>
        </ItemGroup>
        <CopyFile SourceFiles="@(Files)" DestinationFolder="$(TargetDir)DataFiles"/>
    </Target>
    

您可能需要将“ $(TargetDir)”替换为“ $(OutputPath)”。

答案 1 :(得分:0)

我已经解决了

    <Target Name="CopyScenarios" AfterTargets="Build">
    <ItemGroup>  
      <Scenarios Include="$(ProjectDir)/Scenarios/**/*.json" />
    </ItemGroup>
    <Copy SourceFiles="@(Scenarios)" DestinationFiles="@(Scenarios->'$(TargetDir)DataFiles/%(Filename)%(Extension)')" SkipUnchangedFiles="false" />
  </Target>