Kebechet.Build.RemoteAssets 1.0.0

Prefix Reserved
There is a newer version of this package available.
See the version list below for details.
dotnet add package Kebechet.Build.RemoteAssets --version 1.0.0
                    
NuGet\Install-Package Kebechet.Build.RemoteAssets -Version 1.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Kebechet.Build.RemoteAssets" Version="1.0.0">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Kebechet.Build.RemoteAssets" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="Kebechet.Build.RemoteAssets">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Kebechet.Build.RemoteAssets --version 1.0.0
                    
#r "nuget: Kebechet.Build.RemoteAssets, 1.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Kebechet.Build.RemoteAssets@1.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Kebechet.Build.RemoteAssets&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=Kebechet.Build.RemoteAssets&version=1.0.0
                    
Install as a Cake Tool

"Buy Me A Coffee"

Build.RemoteAssets

NuGet Version NuGet Downloads Build Last updated Twitter

Downloads files over HTTP during the build and registers them as build items, so large or frequently replaced binaries stay out of the repository.

Installation

dotnet add package Kebechet.Build.RemoteAssets

Usage

<ItemGroup>
  <RemoteAsset Include="https://cdn.example.com/v1/hero.webp" Path="wwwroot/img" />
  <RemoteAsset Include="https://cdn.example.com/v1/intro.mp4" Path="wwwroot/video" />
</ItemGroup>

In a Razor SDK project those resolve at _content/<YourProject>/img/hero.webp, exactly as if they had been committed under wwwroot/. In a console or class library project they land next to the built assembly.

Item metadata

Metadata Required Meaning
Include yes The URL, or the file name when Url is also set
Path no Directory to save into, relative to the project. Defaults to $(RemoteAssetPath)
Name no File name to save as. Defaults to the last segment of the URL
Url no Explicit URL. Required when the URL contains ? - see below
Sha256 no Expected hash. The build fails if the bytes do not match
ItemType no Content (default), MauiAsset, EmbeddedResource or None

Properties

Property Default Meaning
RemoteAssetPath (empty) Default Path for every item
RemoteAssetItemType Content Default ItemType for every item
RemoteAssetRetries 3 Download attempts before failing
RemoteAssetRetryDelayMilliseconds 2000 Delay between attempts
RemoteAssetsEnabled true Set to false to skip fetching entirely
RemoteAssetStampDirectory $(BaseIntermediateOutputPath)RemoteAssets\ Where the cache manifest lives

Set RemoteAssetPath once when everything shares a folder:

<PropertyGroup>
  <RemoteAssetPath>wwwroot/img/app-previews</RemoteAssetPath>
</PropertyGroup>

<ItemGroup>
  <RemoteAsset Include="https://cdn.example.com/v1/training-plans.webp" />
  <RemoteAsset Include="https://cdn.example.com/v1/workout-summary.webp" />
</ItemGroup>

There is no version property - the URL is the cache key

A file already on disk for the current URL is never requested again, so incremental and offline builds do no network work. Change the URL and the cached copy is replaced:


<RemoteAsset Include="https://cdn.example.com/v2/hero.webp" Path="wwwroot/img" />

Verifying content with Sha256

A URL is mutable. If someone re-uploads over v1/hero.webp you would silently ship different bytes and no commit would record it. Sha256 turns that into a build failure naming the file:

<RemoteAsset Include="https://cdn.example.com/v1/hero.webp"
             Path="wwwroot/img"
             Sha256="9f2c4e8a1b7d5f30c6e94a2b8d1f7c3e5a09b4d6f28e1c7a3b5d9f04e6a2c8b1" />

Compute one with Get-FileHash hero.webp -Algorithm SHA256 or sha256sum hero.webp.

URLs with a query string (SAS tokens)

? is an MSBuild wildcard. A URL containing one, placed in Include, is expanded as a file glob, matches nothing, and the item disappears without an error. Pass such URLs as Url metadata instead, with the file name in Include:

<RemoteAsset Include="hero.webp"
             Url="https://account.blob.core.windows.net/assets/hero.webp?sv=2024-01-01&amp;sig=..."
             Path="wwwroot/img" />

The package detects the broken form and fails with a message pointing here rather than letting it pass silently.

Retired assets are cleaned up

Every downloaded file is tracked by a stamp under obj/RemoteAssets/. Remove an item and the next build deletes the file it left behind. Only files this package downloaded are ever deleted, so a committed file sitting in the same folder as fetched ones is never touched.

Multi-targeted projects

For a project building several target frameworks, the fetch runs once in the outer build before the inner builds fan out. Without that, every inner build would race the others to download the same URL into the same destination file - they run in parallel, so an existence check is not enough on its own.

Ignore the fetched files in git

The point of the package is that these files are not committed:

wwwroot/img/hero.webp
wwwroot/video/intro.mp4

Building without network access

A build whose files are already cached needs no network. A cold build with no cache fails with a message naming the URL, rather than producing output with the asset silently missing. Set RemoteAssetsEnabled=false to skip fetching altogether.

License

MIT

There are no supported framework assets in this package.

Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.1 51 8/11/2026
1.0.0 41 8/11/2026

Initial release.