Often we need to include external files/folders in publish profile to deploy on published site. We have two ways to achieve this:
General file inclusion
In this method we use the DotNetPublishFiles
tag, which is provided by a publish targets file in the Web SDK.
The following example's demonstrates how to copy a folder located outside of the project directory to the published site.
<ItemGroup> <MyCustomFiles Include="$(MSBuildProjectDirectory)/../ExternalContent/**/*" /> <DotNetPublishFiles Include="@(MyCustomFiles)"> <DestinationRelativePath>wwwroot/ExternalContent/%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> </DotNetPublishFiles> </ItemGroup>
-
Declares a
MyCustomFiles
(it can be any custom name) tag to cover files matching theglobbing pattern
specified inInclude
attribute. TheExternalContent
folder referenced in the pattern is located outside of the project directory. We are using a reserved property$(MSBuildProjectDirectory)
, which resolves the project file's absolute path. -
In
DotNetPublishFiles
tag, we provide our custom tag nameMyCustomFiles
in theInclude
attribute, whih serves as a source path for files/folders. InDestinationRelativePath
tag, we specified the target path(with respect to published folder) where we want to copy the files. In this example, we are copyingExternalContent
folder's content towwwroot/ExternalContent
folder. We have also used item metadata such as%(RecursiveDir)
,%(Filename)
,%(Extension)
. This represents thewwwroot/ExternalContent
folder of the published site.
If you don't want to specify source path relative to the project file's absolute path, you can also specific local absolute path, like:
<ItemGroup> <MyCustomFiles Include="C:\Test\ExternalContent\*" /> <DotNetPublishFiles Include="@(MyCustomFiles)"> <DestinationRelativePath>wwwroot/ExternalContent/%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> </DotNetPublishFiles> </ItemGroup>
Here we have changed the source relative path from $(MSBuildProjectDirectory)/../ExternalContent/**/*
to C:\Test\ExternalContent\*
.
Selective file inclusion
In this method we will use the ResolvedFileToPublish
tag, which is provided by a publish targets file in the .NET Core SDK.
Because the Web SDK depends on the .NET Core SDK, either item can be used in an ASP.NET Core project.
The following exmaple demonstrates how to copy a file located outside of the project into the published site's wwwroot
folder.
The file name of externalfile.txt
is maintained.
<ItemGroup> <ResolvedFileToPublish Include="..\externalfile.txt"> <RelativePath>wwwroot\externalfile.txt</RelativePath> </ResolvedFileToPublish> </ItemGroup>
-
In
ResolvedFileToPublish
tag, we are usingInclude
attribute to specify the file we want to copy. This file resides in the parent directory of the project file's container directory. -
RelativePath
represent the relative path for the published directory.
The default behavior of ResolvedFileToPublish
is to always copy the files provided in the Include
attribute to the published site.
We can override this default behavior by including a CopyToPublishDirectory
child tag with inner text of either
Never
or PreserveNewest
. For example:
<ResolvedFileToPublish Include="..\externalfile.txt"> <RelativePath>wwwroot\externalfile.txt</RelativePath> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> </ResolvedFileToPublish>
Again, if you don't want to specify source path relative to the project file's absolute path, you can also specific local absolute path, like:
<ItemGroup> <ResolvedFileToPublish Include="C:\Test\externalfile.txt"> <RelativePath>wwwroot\externalfile.txt</RelativePath> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> </ResolvedFileToPublish> </ItemGroup>