J'ai un projet C # dit MyProject.csproj situé dans "C: \ Projects \ MyProject \". J'ai également des fichiers que je souhaite copier dans le répertoire de sortie de ce projet. Mais, les fichiers sont à l'emplacement "C: \ MyContentFiles \", c'est-à-dire qu'ils ne sont PAS dans le cône du projet. Ce répertoire a également des sous-répertoires. Le contenu du répertoire n'est pas géré. Par conséquent, je dois inclure tout ce qui est en dessous.
Lorsque je les inclut comme «Contenu» dans le projet, ils sont copiés, mais la structure du répertoire est perdue. J'ai fait quelque chose comme ça: -
<Content Include="..\..\MyContentFiles\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
Comment copier ces fichiers / répertoires de manière récursive dans le répertoire de sortie du projet avec la structure de répertoires préservée?
Je crois que @Dmytrii a raison d'une part - vous voulez utiliser la fonction "lien".
Cependant, il n'a que partiellement raison de dire que vous ne pouvez pas créer de lien vers une arborescence de répertoires. Bien que cela soit effectivement vrai lorsque vous essayez d'ajouter les liens à l'aide de l'interface graphique de Visual Studio, MSBuild le prend en charge.
Si vous souhaitez conserver la structure du répertoire, ajoutez simplement la
%(RecursiveDir)
balise à votre<link>
nœud:<Content Include="..\..\MyContentFiles\**\*.*"> <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>
La page Métadonnées d'élément connues de MSBuild donne plus de détails sur les métadonnées auxquelles vous pouvez accéder.
la source
<Content Include="..\..\MyContentFiles\**\*.*">
- notez le\*.*
à la fin du chemin.La réponse de Mandark ajoute les fichiers de contenu directement à la solution, et ils apparaîtront dans l'explorateur de solutions. Chaque fois qu'un fichier est ajouté ou supprimé dans le répertoire d'origine, il n'est pas automatiquement repris par Visual Studio. De plus, chaque fois qu'un fichier est supprimé ou ajouté dans l'explorateur de solutions, le fichier de projet est modifié et tous les fichiers sont inclus séparément, au lieu de simplement inclure le dossier.
Pour éviter cela, vous pouvez utiliser la même astuce, mais placez-le dans un fichier projet séparé, puis importez-le.
Le fichier projet (par exemple include.proj) ressemble à ceci:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <Content Include="..\..\MyContentFiles\**"> <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> </Project>
Dans votre propre fichier de projet, ajoutez la ligne suivante
<Import Project="include.proj" />
Visual Studio ne gâchera pas ce fichier et ajoute simplement des fichiers en tant que contenu lors d'une génération. Les modifications apportées au répertoire d'origine sont toujours incluses. Les fichiers n'apparaîtront pas dans votre explorateur de solutions, mais seront inclus dans le répertoire de sortie.
Repris cette astuce ici: http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx
la source
Ce qui suit, que vous ajouteriez au bas de votre fichier de projet, copiera vos fichiers de contenu en conservant la structure de répertoires dans un événement après la génération dans le répertoire cible
$(TargetDirectory)
de votre génération (généralement$(MSBuildProjectDirectory)\bin\Debug
).<ItemGroup> <ExtraContent Include="$(MSBuildProjectDirectory)\..\..\MyContentFiles\**" /> </ItemGroup> <Target Name="AfterBuild"> <Copy SourceFiles="@(ExtraContent)" DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" /> </Target>
Si ces fichiers devaient aller dans un répertoire nommé MyContentFiles, vous pouvez ajouter ceci avant la copie:
<MakeDir Directories="$(TargetDir)\MyContentFiles" Condition=" !Exists('$(TargetDir\MyContentFiles') " />
et changer
<Copy SourceFiles="@(ExtraContent)" DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />
À
<Copy SourceFiles="@(ExtraContent)" DestinationFiles="@(ExtraContent->'$(TargetDir)\MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />
la source
je pense
<Content Include="..\..\MyContentFiles\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>
Est juste assez, puisque vous voulez tout dans ce dossier et sous-dossiers
la source
Pour inclure des fichiers dans un dossier pour un projet .NET Core,
<!--Just files--> <ItemGroup> <None Update="..\..\MyContentFiles\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> <!--Content files--> <ItemGroup> <Content Include="..\..\MyContentFiles\**\*.*" Link="MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
Et la propriété des éléments "Copier dans le répertoire de sortie" sera "Copier si plus récent":
la source
Pour ignorer un fichier dans un projet .Net Core:
<ItemGroup> <Content Include="appsettings.local.json"> <CopyToOutputDirectory Condition="Exists('appsettings.local.json')">PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
la source