J'ai un VS2008, je veux copier certains fichiers d'un répertoire dans mon /bin/
dossier. J'ai défini les fichiers (situés dans /common/browserhawk/
) dans "Copier vers le répertoire de sortie". Cependant, il copie également la structure des dossiers: les fichiers sont copiés dans /bin/common/browserhawk/
Comment puis-je obtenir ces fichiers à copier juste /bin/
? Je ne veux pas les stocker à la racine du site Web pour les faire copier correctement.
Question connexe: Visual Studio ajoute .dll et .pdb au projet après la compilation
Vous pouvez ajouter un événement post-génération pour copier les fichiers.
Accédez aux propriétés du projet, onglet Créer des événements et ajoutez ce qui suit à la ligne de commande de l'événement post-génération:
copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)"
Assurez-vous d'inclure les guillemets si le chemin de votre projet contient des espaces.
Comme je ne peux pas commenter les réponses précédentes, je vais mettre la solution ici:
En ajoutant à ce que @PaulAlexander a fourni, ajoutez ce qui suit à votre fichier .csproj/.vbproj:
<ItemGroup>
<AvailableItemName Include="RootContent">
<Visible>false</Visible>
</AvailableItemName>
</ItemGroup>
<Target Name="AfterBuild">
<Copy
DestinationFolder="$(OutputPath)"
SourceFiles="@(RootContent)"
SkipUnchangedFiles="true"
/>
</Target>
Cela vous permet de sélectionner "RootContent" comme action de génération dans la fenêtre Propriétés, et tout est accessible via l'interface graphique. Une explication plus complète: l'option "AvailableItemName" crée essentiellement une nouvelle liste nommée à laquelle vous pouvez affecter des éléments dans le projet sous la propriété "Build Action" dans la fenêtre Propriétés. Vous pouvez ensuite utiliser cette liste nouvellement créée dans n'importe quelle cible de votre choix (par exemple via "@ (RootContent)").
Si vous modifiez le fichier .csproj/.vbproj dans un éditeur de texte, vous pouvez contrôler où le fichier est placé dans le répertoire de sortie et également quel nom le fichier aura dans le répertoire de sortie. Par exemple:
<None Include="content\someContent.txt">
<Link>someContentInOutputDirectory.txt</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
Cela mettra le fichier content\someContent.txt
en bin\someContentInOutputDirectory.txt
. Vous pouvez également choisir un sous-répertoire dans bin
si vous le souhaitez; ajoutez-le simplement à l'élément Link.
Je pense que la commande XCOPY gère mieux les répertoires et les fichiers. Par conséquent,
XCOPY "$(ProjectDir)common/browserhawk" "$(TargetDir)" /E /I /F /Y
Ce qui permet de créer des dossiers à partir du répertoire cible.
XCOPY "$(ProjectDir)Templates" "$(TargetDir)" /E /I /F /Y
La structure du dossier/fichier du projet de:
A:\TEMP\CONSOLEAPPLICATION3\TEMPLATES
├───NewFolder1
├───NewFolder2
│ TextFile1.txt
│ TextFile2.txt
└───NewFolder3
TextFile1.txt
TextFile2.txt
TextFile3.txt
Devient:
A:\TEMP\CONSOLEAPPLICATION3\BIN\DEBUG
│ ConsoleApplication3.exe
│ ConsoleApplication3.pdb
│ ConsoleApplication3.vshost.exe
│ ConsoleApplication3.vshost.exe.manifest
├───NewFolder1
├───NewFolder2
│ TextFile1.txt
│ TextFile2.txt
│
└───NewFolder3
TextFile1.txt
TextFile2.txt
TextFile3.txt
Ajoutez ce qui suit à votre fichier .csproj/.vbproj
<Target Name="AfterBuild">
<Copy
DestinationFolder="$(OutputPath)"
SourceFiles="@(RootContent)"
SkipUnchangedFiles="true"
/>
</Target>
Modifiez ensuite l'action de génération de tous les fichiers que vous souhaitez dans le dossier racine en RootContent.
Je l'ai utilisé dans VS2010 et VS2015. Je préfère cette solution car:
<RootContent Include="common\browserhawk\**"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </RootContent>
Vers le début du fichier de projet:
<ItemGroup>
<AvailableItemName Include="RootContent">
<!-- Add "RootContent" as a choice in the "Build Action" dropdown. -->
<Visible>False</Visible>
</AvailableItemName>
</ItemGroup>
Après l'importation Microsoft .targets:
<PropertyGroup>
<AssignTargetPathsDependsOn>
$(AssignTargetPathsDependsOn);
IncludeRootContentAsContent;
</AssignTargetPathsDependsOn>
</PropertyGroup>
<Target Name="IncludeRootContentAsContent">
<CreateItem Include="@(RootContent)" AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)">
<Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
</CreateItem>
</Target>
J'ai fini par ajouter une étape au fichier de construction nant à copier après une compliation réussie
<target name="action.copy.browserhawk.config" depends="compile.source">
<copy todir="${App.Web.dir}/bin/" includeemptydirs="false">
<fileset basedir="${browserhawk.config.dir}">
<include name="bhawk_bb.dat" />
<include name="bhawk_sp.dat" />
<include name="browserhawk.properties" />
<include name="maindefs.bdd" />
<include name="maindefs.bdf" />
<include name="BH_PRO.lic" />
</fileset>
</copy>
<echo message="COPY BROWSERHAWK CONFIG: SUCCESS ${datetime::now()}" />
</target>
Vous pouvez créer un fichier de commandes pour copier les fichiers et l'exécuter en tant qu'événement post-génération.