103

誰かが私が書き込もうとしているmsbuildスクリプトを手伝ってくれるかどうか疑問に思っています。私がやりたいのは、msbuildを使用してすべてのファイルとサブフォルダーをフォルダーから別のフォルダーにコピーすることです。

{ProjectName}
      |----->Source
      |----->Tools
              |----->Viewer
                       |-----{about 5 sub dirs}

私ができる必要があるのは、すべてのファイルとサブフォルダーをツールフォルダーからアプリケーションのデバッグフォルダーにコピーすることです。これは私がこれまでに持っているコードです。

<ItemGroup>
    <Viewer Include="..\$(ApplicationDirectory)\Tools\viewer\**\*.*" />
</ItemGroup>

<Target Name="BeforeBuild">
    <Copy SourceFiles="@(Viewer)" DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" />
</Target>

ビルドスクリプトは実行されますが、ファイルやフォルダーはコピーされません。

ありがとう

4

10 に答える 10

151

私もこれについてヘルプを探していました。しばらく時間がかかりましたが、これが私が実際にうまくいったことです。

<Target Name="AfterBuild">
    <ItemGroup>
        <ANTLR Include="..\Data\antlrcs\**\*.*" />
    </ItemGroup>
    <Copy SourceFiles="@(ANTLR)" DestinationFolder="$(TargetDir)\%(RecursiveDir)" SkipUnchangedFiles="true" />
</Target>

これにより、という名前のフォルダーの内容が再帰的にコピーされantlrcsました$(TargetDir)

于 2013-03-30T16:06:46.813 に答える
73

問題は、ItemGroup の作成方法と Copy タスクの呼び出し方法にあると思います。これが理にかなっていることを確認してください。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    <PropertyGroup>
        <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory>
        <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory>
    </PropertyGroup>

    <Target Name="BeforeBuild">
        <CreateItem Include="$(YourSourceDirectory)\**\*.*">
            <Output TaskParameter="Include" ItemName="YourFilesToCopy" />
        </CreateItem>

        <Copy SourceFiles="@(YourFilesToCopy)"
                DestinationFiles="@(YourFilesToCopy->'$(YourDestinationDirectory)\%(RecursiveDir)%(Filename)%(Extension)')" />
    </Target>
</Project>
于 2008-09-23T12:35:42.007 に答える
36

私は MSBuild を初めて使用しますが、このような状況では EXEC タスクが便利だと思います。私は自分のプロジェクトで同じ課題に遭遇しましたが、これは私にとってはうまくいき、はるかに簡単でした. それが良い習慣でない場合は、誰かが私に知らせてください。

<Target Name="CopyToDeployFolder" DependsOnTargets="CompileWebSite">
    <Exec Command="xcopy.exe  $(OutputDirectory) $(DeploymentDirectory) /e" WorkingDirectory="C:\Windows\" />
</Target>
于 2010-01-03T01:05:57.440 に答える
14
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    <PropertyGroup>
        <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory>
        <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory>
    </PropertyGroup>

    <Target Name="BeforeBuild">
        <CreateItem Include="$(YourSourceDirectory)\**\*.*">
            <Output TaskParameter="Include" ItemName="YourFilesToCopy" />
        </CreateItem>

        <Copy SourceFiles="@(YourFilesToCopy)"
                DestinationFiles="$(YourFilesToCopy)\%(RecursiveDir)" />
    </Target>
</Project>

\**\*.*すべてのフォルダからファイルを取得するのに役立ちます。RecursiveDirは、すべてのファイルをそれぞれのフォルダーに配置するのに役立ちます。

于 2012-10-30T09:33:27.503 に答える
4

代わりに具体的な宛先ディレクトリを指定しようとしましたか

DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" ? 

私は高度な MSBuild 構文に精通しているわけではありませんが、

@(Viewer->'$(OutputPath)\\Tools') 

私には奇妙に見えます。スクリプトは問題ないように見えるので、問題は と の値にある可能性があり$(ApplicationDirectory)ます$(OutputPath)

役に立つかもしれないブログ投稿は次のとおりです。

方法: <Copy> タスクを使用してファイルを再帰的にコピーする

于 2008-09-23T05:33:50.353 に答える
1

個人的には、SDCタスクライブラリの一部であるCopyFolderを利用しました。

http://sdctasks.codeplex.com/

于 2010-04-26T14:28:12.870 に答える