10

かなり大規模なWebアプリケーションをビルドおよび展開するために、MSBuildスクリプトを機能させようとしています。(ここでは、数十のディレクトリにある数千のファイルについて話しています。これは、ほとんど継承されたレガシーコードベースであるため、私ができることはあまりありません。)ビルド自体は正常に実行されますが、コピーを取得できないようです。正しく機能しているドロップ場所へのファイル。

これは、ビルドスクリプトにあるものを示すスニペットです。

<PropertyGroup Condition=" '$(UseBuildNumber)' == 'true' ">
  <ReleaseDirectory>$(ReleaseBaseDirectory)$(ReleaseName)\$(BuildNumber)</ReleaseDirectory>
</PropertyGroup>

<ItemGroup>
  <OutputFiles Include="
               $(SourceRoot)**\*.aspx;
               $(SourceRoot)**\*.dll;
               $(SourceRoot)**\*.gif;
               $(SourceRoot)**\*.ascx;
               " />
</ItemGroup>

<Message Text="Output files ==> @(OutputFiles)" />

<Copy
    SourceFiles="@(OutputFiles)"
    DestinationFolder="$(ReleaseDirectory)"
    SkipUnchangedFiles="false"
    />

個々のパスが正しく拡張され、両方が実際に正しいパスを持っている<Message/>ことを確認するために、そこにいくつかの追加機能を追加しました。ただし、出力では、次のようになります(簡潔にするためにフルパスは省略されています)。$(SourceRoot)$(ReleaseDirectory)

Task "Message"
  Output files ==> ...\Requirement1866**\*.aspx;...\Requirement1866**\*.dll;...\Requirement1866**\*.gif;...\Requirement1866**\*.ascx
Done executing task "Message".

明らかに、ワイルドカード拡張は実行されておらず、次のCopy場合(予想どおり)失敗します。私は1つだけ含めています。実際には、これはファイル名のワイルドカードパターンごとに繰り返されます(これは、上記のビルドスクリプトスニペットに含めたものよりもはるかに多くなります)。

Using "Copy" task from assembly "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "Copy"
  Copying file from "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx".
  Command:
  copy /y "*basedir*\Requirement1866**\*.aspx" "*targetdir*\Requirement1866\*buildnumber*\*.aspx"
d:\Builds\215\BuildType\TFSBuild.proj(120,5): error MSB3021: Unable to copy file "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx". Illegal characters in path.

に続く:

  d:\Builds\215\BuildType\TFSBuild.proj(120,5): error MSB3021: Unable to copy file "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx". Illegal characters in path.

グーグルでの努力で遭遇した唯一の合理的に関連するヒットは、コピータスク-パス内の不正な文字ですが、私はすでにを使用して<ItemGroup>おり、<CreateItem>例(適応)はまったく機能せず、エラーで早期に中止しましたそれは不明だと言っていTaskParameterます(申し訳ありませんが、目の前に正確なエラーメッセージがありません)。

一時的な対策として、関連するファイルをビルド出力ディレクトリから目的の場所に手動でコピーすることもできますが、そのプロセスを自動化する必要があります。

次に、MSBuildを使用して、ビルドプロセス中に作成されたファイルを、相対ディレクトリ構造を保持したまま、1つずつ一覧表示せずに出力ディレクトリにコピーするにはどうすればよいですか?

4

2 に答える 2

22

基本的に、**は単一のパス要素Includeであるため、ディレクティブでは対応してバックスラッシュで区切る必要があります。

<ItemGroup>
  <OutputFiles Include="
               $(SourceRoot)\**\*.aspx;
               $(SourceRoot)\**\*.dll;
               $(SourceRoot)\**\*.gif;
               $(SourceRoot)\**\*.ascx;
               " />
</ItemGroup>

$(SourceRoot)\**\*.aspxたとえば、壊れたとは対照的に指定することの違いに注意してください$(SourceRoot)**\*.aspx$(SourceRoot)で終了した場合\、ワイルドカード拡張も最初は機能していた可能性があります。

次に、で<Copy/>、を使用します%(RecursiveDir)

<Copy
    SourceFiles="@(OutputFiles)"
    DestinationFolder="$(ReleaseDirectory)\%(RecursiveDir)"
    SkipUnchangedFiles="false"
    />

これらの変更により、私が望むように機能するように見えます。ファイルは目的のターゲットディレクトリにコピーされ、ソースのディレクトリ構造はターゲットの場所に保持されます。

于 2012-07-12T09:58:56.780 に答える
2

別の提案では、すべてのファイルタイプに包含を追加する代わりに、除外を追加するのは簡単です。

<ItemGroup>
  <OutputFiles Include="$(SourceRoot)**\*.*" Exclude="$(SourceRoot)**\*.cs;$(SourceRoot)**\*.resx" " />
</ItemGroup>

このように、出力には、必要なJS、HTML、DHTML、およびその他のファイルタイプが含まれます。

于 2013-01-10T15:58:04.827 に答える