2 Stimmen

Team Build, Problem mit dem Kopieren der Zieldatei

Ich habe diese Team-Build-Ziel-Setup, um nach der Kompilierung

  <Target Name="AfterCompile">
    <Copy SourceFiles="$(SolutionRoot)\Development_VS2008\MyCompanyName.SharePoint.12" DestinationFolder="c:\testing"></Copy>
  </Target>

Ich möchte die Ordnerstruktur von der Quelle zum Ziel kopieren...

Erstaunlicherweise erhalte ich diesen Fehler

Die Datei "" konnte nicht kopiert werden. C:\TFS\NightlyBuild\Sources\Development_VS2008\MyCompanyName.SharePoint.12\ " in die Zieldatei "c: \testing\ ", da das Ziel ein Ordner statt einer Datei ist. Um die Quelldatei in einen Ordner zu kopieren, sollten Sie den Parameter DestinationFolder anstelle von DestinationFiles verwenden.

Wie Sie sehen können, verwende ich tatsächlich den Parameter destinationfolder, weiß jemand, was ich falsch mache?

5voto

Kent Boogaart Punkte 170094

Ich denke, es könnte einfach daran liegen, dass SourceFiles ist ein Verzeichnis und nicht die Dateien, die Sie kopieren wollen. Versuchen Sie dies:

<Target Name="AfterCompile">
    <ItemGroup>
        <FilesToCopy Include="$(SolutionRoot)\Development_VS2008\MyCompanyName.SharePoint.12\**\*.*"/>
    </ItemGroup>

    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="c:\testing\%(RecursiveDir)"/>
</Target>

0 Stimmen

Dies funktioniert irgendwie, zumindest seine nicht fehlschlagen, aber seine nicht Beibehaltung der Verzeichnisstruktur in den Zielordner, jede Idee, wie die Struktur auf der anderen Seite zu halten?

0 Stimmen

+1 Von allen bisherigen Lösungen ist diese eleganter und prägnanter, und sie hat mein Kopierproblem gelöst. Sie kopiert die Dateien zusammen mit ihren Ordnern in ein Unterverzeichnis. Vielen Dank, Kent!

2voto

Alex34758 Punkte 379

Dieser Fehler passierte mir nicht unter Team Foundation Projekt, sondern Standalone ein, und wenn ich neue .dll-Datei mit Build-Aktion ContentWithTargetPath hinzufügen. Ich wollte diese Bibliothek in meinem Ausgabeverzeichnis enthalten sein. Record für diese Aktion erscheint in einem der ItemGroup Abschnitt in .csproj Datei wie:

<ContentWithTargetPath Include="Resources\Libraries\libName.dll">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</ContentWithTargetPath>

Aber aus irgendeinem Grund ist dies nicht genug, um ContentWithTargetPath Option funktioniert gut (ich sah die Erklärung darüber irgendwo in StackOverflow, aber nicht erinnern, wo). Sie sollten manuell hinzufügen TargetPath Unterabschnitt zu ContentWithTargetPath wie folgt:

<ContentWithTargetPath Include="Resources\Libraries\libName.dll">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  <TargetPath>libName.dll</TargetPath>
</ContentWithTargetPath>

Der Unterabschnitt TargetPath wird beim Bearbeiten der .csproj-Datei in Visual Studio nicht von IntelliSense angezeigt und erscheint auch nicht im Eigenschaftenfenster von libName.dll, so dass Sie diesen Unterabschnitt von Hand hinzufügen müssen. Dieses Szenario tritt auch in meinem Visual Studio Community 2017 auf.

PS. Sie können die .csproj-Datei in Visual Studio bearbeiten - entladen Sie dieses Projekt und wählen Sie die Option "Edit YourProjectName.csproj" (rechter Mausklick auf das entladene Projekt). Bearbeiten und speichern Sie die .csproj-Datei und laden Sie dann das Projekt erneut.

1 Stimmen

Obwohl mein Fehler die Datei swagget index.html betraf, war dies auch für mich die Lösung. Ich fügte den Tag <TargetPath>index.html</TargetPath> und es hat funktioniert. Danke @Alex34758

1voto

Aaron Powell Punkte 24630

Sie brauchen etwas wie das hier:

<CreateItem Include="someFolder\**\*.*">

    <Output ItemName="files" TaskParameter="Include" />

</CreateItem>

<Copy SourceFiles="@(files)" DestinationFiles="@(files->'C:\folder\%(relativedir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />

Oder alternativ habe ich gefunden, der einfachste Weg (wenn Sie ein bisschen strenger sein wollen, über was einschließen/ausschließen) ist mit einigen benutzerdefinierten MSBuild Aufgaben, die ich geschrieben habe: http://www.aaron-powell.com/blog.aspx?cat=AaronPowell.MSBuild.Tasks

Sie geben ein Quellverzeichnis, eine Zielrichtung (Unterstützung für Netzwerkfreigaben ist vorhanden) und auszuschließende Dateinamen/Erweiterungen an.

Das liegt vor allem daran, dass Team Build ein echtes Chaos anrichtet (insbesondere bei Webanwendungen), wenn es ausgeführt wird, und dass es nicht wirklich möglich ist, die Standard-MSBuild-Kopieraufgaben zu verwenden.

0voto

user53378 Punkte 150

Wir haben eine Menge Probleme mit Postbuild-xcopy-Befehlen. Und wir haben beschlossen, xcopy-Befehle zu vermeiden.

Wir fügen nun die Dateien (die wir kopieren wollen) in das Projekt ein und setzen die Eigenschaft "Copy local" auf "Copy if newer" und das Zielverzeichnis (die Verzeichnisstruktur muss im Projekt gleich sein)

Das ist sehr hilfreich.
Vielleicht passt es auch auf Ihre Situation.

0 Stimmen

Ich brauche Dateien, die ich manuell an andere Orte kopieren muss. Ich dachte an die Verwendung von xcopy, und vielleicht versuche ich das hier.

0voto

timB33 Punkte 1934

Die Kopieraufgabe unterstützt anscheinend nicht das Kopieren von Verzeichnissen (da sie auf 'copy' basiert), und xcopy schlägt manchmal wegen langer Dateinamen in der Quelle (>256 Zeichen) fehl.

Ich habe dies getan (mit robocopy): <Exec WorkingDirectory="$(MSBuildProjectDirectory)" Command='robocopy $(MSBuildProjectDirectory)\Main $(DropLocation) /S /COPY:DATS /NP /NFL /NDL /v' ContinueOnError="true" />

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X