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 patternspecified inIncludeattribute. TheExternalContentfolder 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
DotNetPublishFilestag, we provide our custom tag nameMyCustomFilesin theIncludeattribute, whih serves as a source path for files/folders. InDestinationRelativePathtag, we specified the target path(with respect to published folder) where we want to copy the files. In this example, we are copyingExternalContentfolder's content towwwroot/ExternalContentfolder. We have also used item metadata such as%(RecursiveDir),%(Filename),%(Extension). This represents thewwwroot/ExternalContentfolder 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
ResolvedFileToPublishtag, we are usingIncludeattribute to specify the file we want to copy. This file resides in the parent directory of the project file's container directory. -
RelativePathrepresent 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>
No comments:
Post a Comment