Compare commits
53 Commits
rel/2.0.0-
...
angular-an
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0c47e3def | ||
|
|
e5f1299239 | ||
|
|
c922eee1d6 | ||
|
|
8b243e8cc7 | ||
|
|
28920c7691 | ||
|
|
412ec1b427 | ||
|
|
c62a3b491c | ||
|
|
559832bb6d | ||
|
|
45d645931b | ||
|
|
8d6119f31d | ||
|
|
0291686b20 | ||
|
|
7c52be5e42 | ||
|
|
900e9ca835 | ||
|
|
ad758b1060 | ||
|
|
cd9ad38a99 | ||
|
|
e057cb35ec | ||
|
|
eea2066a6d | ||
|
|
d6ae8829b6 | ||
|
|
a94ac6f37e | ||
|
|
a40adab38d | ||
|
|
c2a284d5b8 | ||
|
|
fc398d602a | ||
|
|
90c59ff4e7 | ||
|
|
a7e715c88f | ||
|
|
6dddc9d01d | ||
|
|
5ed1a35ce0 | ||
|
|
680ba7497a | ||
|
|
63f7ac9330 | ||
|
|
d2858beaa1 | ||
|
|
5f1450c9ba | ||
|
|
c83605baff | ||
|
|
fc12d722b8 | ||
|
|
372e597f34 | ||
|
|
3715ec7c3f | ||
|
|
d2eaa36372 | ||
|
|
895a61160e | ||
|
|
b8b769aa74 | ||
|
|
c4aad6bcab | ||
|
|
27f1d07d21 | ||
|
|
0cb14a3c68 | ||
|
|
2457b4ee5d | ||
|
|
a902874754 | ||
|
|
f43ea777eb | ||
|
|
d1198aeab2 | ||
|
|
a9ddf1413f | ||
|
|
a0a710a0df | ||
|
|
d5f5ad7fdc | ||
|
|
2df0febfba | ||
|
|
b434eefd83 | ||
|
|
44360b6955 | ||
|
|
72b1e627b0 | ||
|
|
781c5dc37c | ||
|
|
c2f63f21fd |
11
.gitignore
vendored
@@ -29,14 +29,7 @@ nuget.exe
|
|||||||
npm-debug.log
|
npm-debug.log
|
||||||
/.build/
|
/.build/
|
||||||
|
|
||||||
# The templates can't contain their own .gitignore files, because Yeoman has strange default handling for
|
|
||||||
# files with that name (https://github.com/npm/npm/issues/1862). So, each template instead has a template_gitignore
|
|
||||||
# file which gets renamed after the files are copied. And so any files that need to be excluded in the source
|
|
||||||
# repo have to be excluded here.
|
|
||||||
/templates/*/node_modules/
|
|
||||||
/templates/*/wwwroot/dist/
|
|
||||||
/templates/*/ClientApp/dist/
|
|
||||||
/templates/*/yarn.lock
|
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
/templates/*/Properties/launchSettings.json
|
global.json
|
||||||
|
korebuild-lock.txt
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<clear />
|
<clear />
|
||||||
<add key="AspNetCore" value="https://dotnet.myget.org/F/aspnetcore-ci-release/api/v3/index.json" />
|
<add key="AspNetCore" value="https://dotnet.myget.org/F/aspnetcore-ci-dev/api/v3/index.json" />
|
||||||
<add key="AspNetCoreTools" value="https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json" />
|
<add key="AspNetCoreTools" value="https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json" />
|
||||||
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
|
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
|
||||||
</packageSources>
|
</packageSources>
|
||||||
</configuration>
|
</configuration>
|
||||||
10
appveyor.yml
@@ -1,4 +1,4 @@
|
|||||||
init:
|
init:
|
||||||
- git config --global core.autocrlf true
|
- git config --global core.autocrlf true
|
||||||
install:
|
install:
|
||||||
- ps: Install-Product node 6.9.2 x64
|
- ps: Install-Product node 6.9.2 x64
|
||||||
@@ -18,13 +18,15 @@ build_script:
|
|||||||
- npm run build
|
- npm run build
|
||||||
- ps: Pop-Location
|
- ps: Pop-Location
|
||||||
artifacts:
|
artifacts:
|
||||||
- path: templates\package-builder\dist\artifacts\generator-aspnetcore-spa.tar.gz
|
- path: templates\package-builder\artifacts\*.nupkg
|
||||||
name: generator-aspnetcore-spa
|
|
||||||
- path: templates\package-builder\dist\artifacts\*.nupkg
|
|
||||||
name: Microsoft.AspNetCore.SpaTemplates
|
name: Microsoft.AspNetCore.SpaTemplates
|
||||||
type: NuGetPackage
|
type: NuGetPackage
|
||||||
# - ps: .\build.ps1
|
# - ps: .\build.ps1
|
||||||
clone_depth: 1
|
clone_depth: 1
|
||||||
|
environment:
|
||||||
|
global:
|
||||||
|
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
|
||||||
|
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
||||||
test_script:
|
test_script:
|
||||||
- dotnet restore
|
- dotnet restore
|
||||||
- ps: Push-Location
|
- ps: Push-Location
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
@ECHO OFF
|
@ECHO OFF
|
||||||
PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE"
|
PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE"
|
||||||
|
|||||||
218
build.ps1
@@ -1,67 +1,177 @@
|
|||||||
$ErrorActionPreference = "Stop"
|
#!/usr/bin/env powershell
|
||||||
|
#requires -version 4
|
||||||
|
|
||||||
function DownloadWithRetry([string] $url, [string] $downloadLocation, [int] $retries)
|
<#
|
||||||
{
|
.SYNOPSIS
|
||||||
while($true)
|
Build this repository
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Invoke-WebRequest $url -OutFile $downloadLocation
|
|
||||||
break
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
$exceptionMessage = $_.Exception.Message
|
|
||||||
Write-Host "Failed to download '$url': $exceptionMessage"
|
|
||||||
if ($retries -gt 0) {
|
|
||||||
$retries--
|
|
||||||
Write-Host "Waiting 10 seconds before retrying. Retries left: $retries"
|
|
||||||
Start-Sleep -Seconds 10
|
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Downloads korebuild if required. Then builds the repository.
|
||||||
|
|
||||||
|
.PARAMETER Path
|
||||||
|
The folder to build. Defaults to the folder containing this script.
|
||||||
|
|
||||||
|
.PARAMETER Channel
|
||||||
|
The channel of KoreBuild to download. Overrides the value from the config file.
|
||||||
|
|
||||||
|
.PARAMETER DotNetHome
|
||||||
|
The directory where .NET Core tools will be stored.
|
||||||
|
|
||||||
|
.PARAMETER ToolsSource
|
||||||
|
The base url where build tools can be downloaded. Overrides the value from the config file.
|
||||||
|
|
||||||
|
.PARAMETER Update
|
||||||
|
Updates KoreBuild to the latest version even if a lock file is present.
|
||||||
|
|
||||||
|
.PARAMETER ConfigFile
|
||||||
|
The path to the configuration file that stores values. Defaults to version.xml.
|
||||||
|
|
||||||
|
.PARAMETER MSBuildArgs
|
||||||
|
Arguments to be passed to MSBuild
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
This function will create a file $PSScriptRoot/korebuild-lock.txt. This lock file can be committed to source, but does not have to be.
|
||||||
|
When the lockfile is not present, KoreBuild will create one using latest available version from $Channel.
|
||||||
|
|
||||||
|
The $ConfigFile is expected to be an XML file. It is optional, and the configuration values in it are optional as well.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
Example config file:
|
||||||
|
```xml
|
||||||
|
<!-- version.xml -->
|
||||||
|
<Project>
|
||||||
|
<PropertyGroup>
|
||||||
|
<KoreBuildChannel>dev</KoreBuildChannel>
|
||||||
|
<KoreBuildToolsSource>https://aspnetcore.blob.core.windows.net/buildtools</KoreBuildToolsSource>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
|
```
|
||||||
|
#>
|
||||||
|
[CmdletBinding(PositionalBinding = $false)]
|
||||||
|
param(
|
||||||
|
[string]$Path = $PSScriptRoot,
|
||||||
|
[Alias('c')]
|
||||||
|
[string]$Channel,
|
||||||
|
[Alias('d')]
|
||||||
|
[string]$DotNetHome,
|
||||||
|
[Alias('s')]
|
||||||
|
[string]$ToolsSource,
|
||||||
|
[Alias('u')]
|
||||||
|
[switch]$Update,
|
||||||
|
[string]$ConfigFile = (Join-Path $PSScriptRoot 'version.xml'),
|
||||||
|
[Parameter(ValueFromRemainingArguments = $true)]
|
||||||
|
[string[]]$MSBuildArgs
|
||||||
|
)
|
||||||
|
|
||||||
|
Set-StrictMode -Version 2
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
#
|
||||||
|
# Functions
|
||||||
|
#
|
||||||
|
|
||||||
|
function Get-KoreBuild {
|
||||||
|
|
||||||
|
$lockFile = Join-Path $Path 'korebuild-lock.txt'
|
||||||
|
|
||||||
|
if (!(Test-Path $lockFile) -or $Update) {
|
||||||
|
Get-RemoteFile "$ToolsSource/korebuild/channels/$Channel/latest.txt" $lockFile
|
||||||
|
}
|
||||||
|
|
||||||
|
$version = Get-Content $lockFile | Where-Object { $_ -like 'version:*' } | Select-Object -first 1
|
||||||
|
if (!$version) {
|
||||||
|
Write-Error "Failed to parse version from $lockFile. Expected a line that begins with 'version:'"
|
||||||
|
}
|
||||||
|
$version = $version.TrimStart('version:').Trim()
|
||||||
|
$korebuildPath = Join-Paths $DotNetHome ('buildtools', 'korebuild', $version)
|
||||||
|
|
||||||
|
if (!(Test-Path $korebuildPath)) {
|
||||||
|
Write-Host -ForegroundColor Magenta "Downloading KoreBuild $version"
|
||||||
|
New-Item -ItemType Directory -Path $korebuildPath | Out-Null
|
||||||
|
$remotePath = "$ToolsSource/korebuild/artifacts/$version/korebuild.$version.zip"
|
||||||
|
|
||||||
|
try {
|
||||||
|
$tmpfile = Join-Path ([IO.Path]::GetTempPath()) "KoreBuild-$([guid]::NewGuid()).zip"
|
||||||
|
Get-RemoteFile $remotePath $tmpfile
|
||||||
|
if (Get-Command -Name 'Expand-Archive' -ErrorAction Ignore) {
|
||||||
|
# Use built-in commands where possible as they are cross-plat compatible
|
||||||
|
Expand-Archive -Path $tmpfile -DestinationPath $korebuildPath
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
# Fallback to old approach for old installations of PowerShell
|
||||||
$exception = $_.Exception
|
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||||
throw $exception
|
[System.IO.Compression.ZipFile]::ExtractToDirectory($tmpfile, $korebuildPath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch {
|
||||||
|
Remove-Item -Recurse -Force $korebuildPath -ErrorAction Ignore
|
||||||
|
throw
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
Remove-Item $tmpfile -ErrorAction Ignore
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $korebuildPath
|
||||||
}
|
}
|
||||||
|
|
||||||
cd $PSScriptRoot
|
function Join-Paths([string]$path, [string[]]$childPaths) {
|
||||||
|
$childPaths | ForEach-Object { $path = Join-Path $path $_ }
|
||||||
$repoFolder = $PSScriptRoot
|
return $path
|
||||||
$env:REPO_FOLDER = $repoFolder
|
|
||||||
|
|
||||||
$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/2.0.0.zip"
|
|
||||||
if ($env:KOREBUILD_ZIP)
|
|
||||||
{
|
|
||||||
$koreBuildZip=$env:KOREBUILD_ZIP
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$buildFolder = ".build"
|
function Get-RemoteFile([string]$RemotePath, [string]$LocalPath) {
|
||||||
$buildFile="$buildFolder\KoreBuild.ps1"
|
if ($RemotePath -notlike 'http*') {
|
||||||
|
Copy-Item $RemotePath $LocalPath
|
||||||
if (!(Test-Path $buildFolder)) {
|
return
|
||||||
Write-Host "Downloading KoreBuild from $koreBuildZip"
|
|
||||||
|
|
||||||
$tempFolder=$env:TEMP + "\KoreBuild-" + [guid]::NewGuid()
|
|
||||||
New-Item -Path "$tempFolder" -Type directory | Out-Null
|
|
||||||
|
|
||||||
$localZipFile="$tempFolder\korebuild.zip"
|
|
||||||
|
|
||||||
DownloadWithRetry -url $koreBuildZip -downloadLocation $localZipFile -retries 6
|
|
||||||
|
|
||||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
|
||||||
[System.IO.Compression.ZipFile]::ExtractToDirectory($localZipFile, $tempFolder)
|
|
||||||
|
|
||||||
New-Item -Path "$buildFolder" -Type directory | Out-Null
|
|
||||||
copy-item "$tempFolder\**\build\*" $buildFolder -Recurse
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
if (Test-Path $tempFolder) {
|
|
||||||
Remove-Item -Recurse -Force $tempFolder
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$retries = 10
|
||||||
|
while ($retries -gt 0) {
|
||||||
|
$retries -= 1
|
||||||
|
try {
|
||||||
|
Invoke-WebRequest -UseBasicParsing -Uri $RemotePath -OutFile $LocalPath
|
||||||
|
return
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Verbose "Request failed. $retries retries remaining"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Error "Download failed: '$RemotePath'."
|
||||||
}
|
}
|
||||||
|
|
||||||
&"$buildFile" @args
|
#
|
||||||
|
# Main
|
||||||
|
#
|
||||||
|
|
||||||
|
# Load configuration or set defaults
|
||||||
|
|
||||||
|
if (Test-Path $ConfigFile) {
|
||||||
|
[xml] $config = Get-Content $ConfigFile
|
||||||
|
if (!($Channel)) { [string] $Channel = Select-Xml -Xml $config -XPath '/Project/PropertyGroup/KoreBuildChannel' }
|
||||||
|
if (!($ToolsSource)) { [string] $ToolsSource = Select-Xml -Xml $config -XPath '/Project/PropertyGroup/KoreBuildToolsSource' }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$DotNetHome) {
|
||||||
|
$DotNetHome = if ($env:DOTNET_HOME) { $env:DOTNET_HOME } `
|
||||||
|
elseif ($env:USERPROFILE) { Join-Path $env:USERPROFILE '.dotnet'} `
|
||||||
|
elseif ($env:HOME) {Join-Path $env:HOME '.dotnet'}`
|
||||||
|
else { Join-Path $PSScriptRoot '.dotnet'}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$Channel) { $Channel = 'dev' }
|
||||||
|
if (!$ToolsSource) { $ToolsSource = 'https://aspnetcore.blob.core.windows.net/buildtools' }
|
||||||
|
|
||||||
|
# Execute
|
||||||
|
|
||||||
|
$korebuildPath = Get-KoreBuild
|
||||||
|
Import-Module -Force -Scope Local (Join-Path $korebuildPath 'KoreBuild.psd1')
|
||||||
|
|
||||||
|
try {
|
||||||
|
Install-Tools $ToolsSource $DotNetHome
|
||||||
|
Invoke-RepositoryBuild $Path @MSBuildArgs
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
Remove-Module 'KoreBuild' -ErrorAction Ignore
|
||||||
|
}
|
||||||
|
|||||||
227
build.sh
@@ -1,46 +1,199 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
||||||
cd $repoFolder
|
|
||||||
|
|
||||||
koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/2.0.0.zip"
|
set -euo pipefail
|
||||||
if [ ! -z $KOREBUILD_ZIP ]; then
|
|
||||||
koreBuildZip=$KOREBUILD_ZIP
|
|
||||||
fi
|
|
||||||
|
|
||||||
buildFolder=".build"
|
#
|
||||||
buildFile="$buildFolder/KoreBuild.sh"
|
# variables
|
||||||
|
#
|
||||||
|
|
||||||
if test ! -d $buildFolder; then
|
RESET="\033[0m"
|
||||||
echo "Downloading KoreBuild from $koreBuildZip"
|
RED="\033[0;31m"
|
||||||
|
MAGENTA="\033[0;95m"
|
||||||
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
[ -z "${DOTNET_HOME:-}" ] && DOTNET_HOME="$HOME/.dotnet"
|
||||||
|
config_file="$DIR/version.xml"
|
||||||
|
verbose=false
|
||||||
|
update=false
|
||||||
|
repo_path="$DIR"
|
||||||
|
channel=''
|
||||||
|
tools_source=''
|
||||||
|
|
||||||
tempFolder="/tmp/KoreBuild-$(uuidgen)"
|
#
|
||||||
mkdir $tempFolder
|
# Functions
|
||||||
|
#
|
||||||
|
__usage() {
|
||||||
|
echo "Usage: $(basename "${BASH_SOURCE[0]}") [options] [[--] <MSBUILD_ARG>...]"
|
||||||
|
echo ""
|
||||||
|
echo "Arguments:"
|
||||||
|
echo " <MSBUILD_ARG>... Arguments passed to MSBuild. Variable number of arguments allowed."
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " --verbose Show verbose output."
|
||||||
|
echo " -c|--channel <CHANNEL> The channel of KoreBuild to download. Overrides the value from the config file.."
|
||||||
|
echo " --config-file <FILE> TThe path to the configuration file that stores values. Defaults to version.xml."
|
||||||
|
echo " -d|--dotnet-home <DIR> The directory where .NET Core tools will be stored. Defaults to '\$DOTNET_HOME' or '\$HOME/.dotnet."
|
||||||
|
echo " --path <PATH> The directory to build. Defaults to the directory containing the script."
|
||||||
|
echo " -s|--tools-source <URL> The base url where build tools can be downloaded. Overrides the value from the config file."
|
||||||
|
echo " -u|--update Update to the latest KoreBuild even if the lock file is present."
|
||||||
|
echo ""
|
||||||
|
echo "Description:"
|
||||||
|
echo " This function will create a file \$DIR/korebuild-lock.txt. This lock file can be committed to source, but does not have to be."
|
||||||
|
echo " When the lockfile is not present, KoreBuild will create one using latest available version from \$channel."
|
||||||
|
|
||||||
localZipFile="$tempFolder/korebuild.zip"
|
if [[ "${1:-}" != '--no-exit' ]]; then
|
||||||
|
exit 2
|
||||||
retries=6
|
|
||||||
until (wget -O $localZipFile $koreBuildZip 2>/dev/null || curl -o $localZipFile --location $koreBuildZip 2>/dev/null)
|
|
||||||
do
|
|
||||||
echo "Failed to download '$koreBuildZip'"
|
|
||||||
if [ "$retries" -le 0 ]; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
retries=$((retries - 1))
|
|
||||||
echo "Waiting 10 seconds before retrying. Retries left: $retries"
|
|
||||||
sleep 10s
|
|
||||||
done
|
|
||||||
|
|
||||||
unzip -q -d $tempFolder $localZipFile
|
|
||||||
|
|
||||||
mkdir $buildFolder
|
|
||||||
cp -r $tempFolder/**/build/** $buildFolder
|
|
||||||
|
|
||||||
chmod +x $buildFile
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
if test -d $tempFolder; then
|
|
||||||
rm -rf $tempFolder
|
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_korebuild() {
|
||||||
|
local version
|
||||||
|
local lock_file="$repo_path/korebuild-lock.txt"
|
||||||
|
if [ ! -f "$lock_file" ] || [ "$update" = true ]; then
|
||||||
|
__get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" "$lock_file"
|
||||||
|
fi
|
||||||
|
version="$(grep 'version:*' -m 1 "$lock_file")"
|
||||||
|
if [[ "$version" == '' ]]; then
|
||||||
|
__error "Failed to parse version from $lock_file. Expected a line that begins with 'version:'"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
version="$(echo "${version#version:}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
|
||||||
|
local korebuild_path="$DOTNET_HOME/buildtools/korebuild/$version"
|
||||||
|
|
||||||
|
{
|
||||||
|
if [ ! -d "$korebuild_path" ]; then
|
||||||
|
mkdir -p "$korebuild_path"
|
||||||
|
local remote_path="$tools_source/korebuild/artifacts/$version/korebuild.$version.zip"
|
||||||
|
tmpfile="$(mktemp)"
|
||||||
|
echo -e "${MAGENTA}Downloading KoreBuild ${version}${RESET}"
|
||||||
|
if __get_remote_file "$remote_path" "$tmpfile"; then
|
||||||
|
unzip -q -d "$korebuild_path" "$tmpfile"
|
||||||
|
fi
|
||||||
|
rm "$tmpfile" || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
source "$korebuild_path/KoreBuild.sh"
|
||||||
|
} || {
|
||||||
|
if [ -d "$korebuild_path" ]; then
|
||||||
|
echo "Cleaning up after failed installation"
|
||||||
|
rm -rf "$korebuild_path" || true
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__error() {
|
||||||
|
echo -e "${RED}$*${RESET}" 1>&2
|
||||||
|
}
|
||||||
|
|
||||||
|
__machine_has() {
|
||||||
|
hash "$1" > /dev/null 2>&1
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
|
__get_remote_file() {
|
||||||
|
local remote_path=$1
|
||||||
|
local local_path=$2
|
||||||
|
|
||||||
|
if [[ "$remote_path" != 'http'* ]]; then
|
||||||
|
cp "$remote_path" "$local_path"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
local failed=false
|
||||||
|
if __machine_has wget; then
|
||||||
|
wget --tries 10 --quiet -O "$local_path" "$remote_path" || failed=true
|
||||||
|
else
|
||||||
|
failed=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$failed" = true ] && __machine_has curl; then
|
||||||
|
failed=false
|
||||||
|
curl --retry 10 -sSL -f --create-dirs -o "$local_path" "$remote_path" || failed=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$failed" = true ]; then
|
||||||
|
__error "Download failed: $remote_path" 1>&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
__read_dom () { local IFS=\> ; read -r -d \< ENTITY CONTENT ;}
|
||||||
|
|
||||||
|
#
|
||||||
|
# main
|
||||||
|
#
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-\?|-h|--help)
|
||||||
|
__usage --no-exit
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-c|--channel|-Channel)
|
||||||
|
shift
|
||||||
|
channel="${1:-}"
|
||||||
|
[ -z "$channel" ] && __usage
|
||||||
|
;;
|
||||||
|
--config-file|-ConfigFile)
|
||||||
|
shift
|
||||||
|
config_file="${1:-}"
|
||||||
|
[ -z "$config_file" ] && __usage
|
||||||
|
;;
|
||||||
|
-d|--dotnet-home|-DotNetHome)
|
||||||
|
shift
|
||||||
|
DOTNET_HOME="${1:-}"
|
||||||
|
[ -z "$DOTNET_HOME" ] && __usage
|
||||||
|
;;
|
||||||
|
--path|-Path)
|
||||||
|
shift
|
||||||
|
repo_path="${1:-}"
|
||||||
|
[ -z "$repo_path" ] && __usage
|
||||||
|
;;
|
||||||
|
-s|--tools-source|-ToolsSource)
|
||||||
|
shift
|
||||||
|
tools_source="${1:-}"
|
||||||
|
[ -z "$tools_source" ] && __usage
|
||||||
|
;;
|
||||||
|
-u|--update|-Update)
|
||||||
|
update=true
|
||||||
|
;;
|
||||||
|
--verbose|-Verbose)
|
||||||
|
verbose=true
|
||||||
|
;;
|
||||||
|
--)
|
||||||
|
shift
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if ! __machine_has unzip; then
|
||||||
|
__error 'Missing required command: unzip'
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$buildFile -r $repoFolder "$@"
|
if ! __machine_has curl && ! __machine_has wget; then
|
||||||
|
__error 'Missing required command. Either wget or curl is required.'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$config_file" ]; then
|
||||||
|
comment=false
|
||||||
|
while __read_dom; do
|
||||||
|
if [ "$comment" = true ]; then [[ $CONTENT == *'-->'* ]] && comment=false ; continue; fi
|
||||||
|
if [[ $ENTITY == '!--'* ]]; then comment=true; continue; fi
|
||||||
|
if [ -z "$channel" ] && [[ $ENTITY == "KoreBuildChannel" ]]; then channel=$CONTENT; fi
|
||||||
|
if [ -z "$tools_source" ] && [[ $ENTITY == "KoreBuildToolsSource" ]]; then tools_source=$CONTENT; fi
|
||||||
|
done < "$config_file"
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -z "$channel" ] && channel='dev'
|
||||||
|
[ -z "$tools_source" ] && tools_source='https://aspnetcore.blob.core.windows.net/buildtools'
|
||||||
|
|
||||||
|
get_korebuild
|
||||||
|
install_tools "$tools_source" "$DOTNET_HOME"
|
||||||
|
invoke_repository_build "$repo_path" "$@"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<Project>
|
<Project>
|
||||||
<Import Project="dependencies.props" />
|
<Import Project="dependencies.props" />
|
||||||
<Import Project="..\version.props" />
|
<Import Project="..\version.xml" />
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Product>Microsoft ASP.NET Core</Product>
|
<Product>Microsoft ASP.NET Core</Product>
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<AspNetCoreVersion>2.0.0-*</AspNetCoreVersion>
|
<AspNetCoreVersion>2.1.0-*</AspNetCoreVersion>
|
||||||
<AutoMapperVersion>5.0.2</AutoMapperVersion>
|
<InternalAspNetCoreSdkVersion>2.1.1-*</InternalAspNetCoreSdkVersion>
|
||||||
<InternalAspNetCoreSdkVersion>2.0.1-*</InternalAspNetCoreSdkVersion>
|
|
||||||
<JsonNetVersion>10.0.1</JsonNetVersion>
|
<JsonNetVersion>10.0.1</JsonNetVersion>
|
||||||
<NETStandardImplicitPackageVersion>2.0.0-*</NETStandardImplicitPackageVersion>
|
<NETStandardImplicitPackageVersion>2.0.0-*</NETStandardImplicitPackageVersion>
|
||||||
<NETStandardLibraryNETFrameworkVersion>2.0.0-*</NETStandardLibraryNETFrameworkVersion>
|
<NETStandardLibraryNETFrameworkVersion>2.0.0-*</NETStandardLibraryNETFrameworkVersion>
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ namespace ConsoleApplication
|
|||||||
// Since .NET Core 1.1, the HTTP hosting model has become basically as fast as the Socket hosting model
|
// Since .NET Core 1.1, the HTTP hosting model has become basically as fast as the Socket hosting model
|
||||||
//options.UseSocketHosting();
|
//options.UseSocketHosting();
|
||||||
|
|
||||||
options.ProjectPath = Directory.GetCurrentDirectory();
|
|
||||||
options.WatchFileExtensions = new string[] {}; // Don't watch anything
|
options.WatchFileExtensions = new string[] {}; // Don't watch anything
|
||||||
});
|
});
|
||||||
var serviceProvider = services.BuildServiceProvider();
|
var serviceProvider = services.BuildServiceProvider();
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using Microsoft.AspNetCore.NodeServices.HostingModels;
|
using Microsoft.AspNetCore.NodeServices.HostingModels;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
@@ -34,14 +35,18 @@ namespace Microsoft.AspNetCore.NodeServices
|
|||||||
InvocationTimeoutMilliseconds = DefaultInvocationTimeoutMilliseconds;
|
InvocationTimeoutMilliseconds = DefaultInvocationTimeoutMilliseconds;
|
||||||
WatchFileExtensions = (string[])DefaultWatchFileExtensions.Clone();
|
WatchFileExtensions = (string[])DefaultWatchFileExtensions.Clone();
|
||||||
|
|
||||||
// In an ASP.NET environment, we can use the IHostingEnvironment data to auto-populate a few
|
|
||||||
// things that you'd otherwise have to specify manually
|
|
||||||
var hostEnv = serviceProvider.GetService<IHostingEnvironment>();
|
var hostEnv = serviceProvider.GetService<IHostingEnvironment>();
|
||||||
if (hostEnv != null)
|
if (hostEnv != null)
|
||||||
{
|
{
|
||||||
|
// In an ASP.NET environment, we can use the IHostingEnvironment data to auto-populate a few
|
||||||
|
// things that you'd otherwise have to specify manually
|
||||||
ProjectPath = hostEnv.ContentRootPath;
|
ProjectPath = hostEnv.ContentRootPath;
|
||||||
EnvironmentVariables["NODE_ENV"] = hostEnv.IsDevelopment() ? "development" : "production"; // De-facto standard values for Node
|
EnvironmentVariables["NODE_ENV"] = hostEnv.IsDevelopment() ? "development" : "production"; // De-facto standard values for Node
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ProjectPath = Directory.GetCurrentDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
var applicationLifetime = serviceProvider.GetService<IApplicationLifetime>();
|
var applicationLifetime = serviceProvider.GetService<IApplicationLifetime>();
|
||||||
if (applicationLifetime != null)
|
if (applicationLifetime != null)
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
|
|||||||
options.DebuggingPort)
|
options.DebuggingPort)
|
||||||
{
|
{
|
||||||
_client = new HttpClient();
|
_client = new HttpClient();
|
||||||
|
_client.Timeout = TimeSpan.FromMilliseconds(options.InvocationTimeoutMilliseconds + 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string MakeCommandLineOptions(int port)
|
private static string MakeCommandLineOptions(int port)
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ module.exports = {
|
|||||||
|
|
||||||
## Hosting models
|
## Hosting models
|
||||||
|
|
||||||
NodeServices has a pluggable hosting/transport mechanism, because it is an abstraction over various possible ways to invoke Node.js from .NET. This allows more high-level facilities (e.g., for Angular prerendering) to be agnostic to the details of launching Node and communicating it - those high-level facilities can just trust that *somehow* we can invoke code in Node for them.
|
NodeServices has a pluggable hosting/transport mechanism, because it is an abstraction over various possible ways to invoke Node.js from .NET. This allows more high-level facilities (e.g., for Angular prerendering) to be agnostic to the details of launching Node and communicating with it - those high-level facilities can just trust that *somehow* we can invoke code in Node for them.
|
||||||
|
|
||||||
Using this abstraction, we could run Node inside the .NET process, in a separate process on the same machine, or even on a different machine altogether. At the time of writing, all the built-in hosting mechanisms work by launching Node as a separate process on the same machine as your .NET code.
|
Using this abstraction, we could run Node inside the .NET process, in a separate process on the same machine, or even on a different machine altogether. At the time of writing, all the built-in hosting mechanisms work by launching Node as a separate process on the same machine as your .NET code.
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Threading;
|
|||||||
using Microsoft.AspNetCore.NodeServices;
|
using Microsoft.AspNetCore.NodeServices;
|
||||||
using Microsoft.AspNetCore.SpaServices.Webpack;
|
using Microsoft.AspNetCore.SpaServices.Webpack;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Serialization;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Builder
|
namespace Microsoft.AspNetCore.Builder
|
||||||
{
|
{
|
||||||
@@ -14,6 +15,12 @@ namespace Microsoft.AspNetCore.Builder
|
|||||||
{
|
{
|
||||||
private const string DefaultConfigFile = "webpack.config.js";
|
private const string DefaultConfigFile = "webpack.config.js";
|
||||||
|
|
||||||
|
private static readonly JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings
|
||||||
|
{
|
||||||
|
ContractResolver = new CamelCasePropertyNamesContractResolver(),
|
||||||
|
TypeNameHandling = TypeNameHandling.None
|
||||||
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Enables Webpack dev middleware support. This hosts an instance of the Webpack compiler in memory
|
/// Enables Webpack dev middleware support. This hosts an instance of the Webpack compiler in memory
|
||||||
/// in your application so that you can always serve up-to-date Webpack-built resources without having
|
/// in your application so that you can always serve up-to-date Webpack-built resources without having
|
||||||
@@ -87,7 +94,7 @@ namespace Microsoft.AspNetCore.Builder
|
|||||||
};
|
};
|
||||||
var devServerInfo =
|
var devServerInfo =
|
||||||
nodeServices.InvokeExportAsync<WebpackDevServerInfo>(nodeScript.FileName, "createWebpackDevServer",
|
nodeServices.InvokeExportAsync<WebpackDevServerInfo>(nodeScript.FileName, "createWebpackDevServer",
|
||||||
JsonConvert.SerializeObject(devServerOptions)).Result;
|
JsonConvert.SerializeObject(devServerOptions, jsonSerializerSettings)).Result;
|
||||||
|
|
||||||
// If we're talking to an older version of aspnet-webpack, it will return only a single PublicPath,
|
// If we're talking to an older version of aspnet-webpack, it will return only a single PublicPath,
|
||||||
// not an array of PublicPaths. Handle that scenario.
|
// not an array of PublicPaths. Handle that scenario.
|
||||||
|
|||||||
5
src/Microsoft.AspNetCore.SpaServices/npm/aspnet-angular/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
/node_modules/
|
||||||
|
**/*.js
|
||||||
|
**/*.d.ts
|
||||||
|
**/*.metadata.json
|
||||||
|
/compiled
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
!/*.js
|
||||||
|
!/*.d.ts
|
||||||
|
/compiled
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
||||||
|
these files except in compliance with the License. You may obtain a copy of the
|
||||||
|
License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software distributed
|
||||||
|
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||||||
|
CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations under the License.
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"name": "aspnet-angular",
|
||||||
|
"version": "0.1.1",
|
||||||
|
"description": "Helpers for using Angular in ASP.NET Core projects",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"prepublish": "rimraf *.d.ts && ngc && echo 'Finished building NPM package \"aspnet-angular\"'",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/aspnet/JavaScriptServices.git"
|
||||||
|
},
|
||||||
|
"author": "Microsoft",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/aspnet/JavaScriptServices/issues"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@angular/common": "^4.3.2",
|
||||||
|
"@angular/compiler": "^4.3.2",
|
||||||
|
"@angular/compiler-cli": "^4.3.2",
|
||||||
|
"@angular/core": "^4.3.2",
|
||||||
|
"@angular/http": "^4.3.2",
|
||||||
|
"@angular/platform-browser": "^4.3.2",
|
||||||
|
"rimraf": "^2.6.1",
|
||||||
|
"rxjs": "^5.4.2",
|
||||||
|
"zone.js": "^0.8.16"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/core": "^4.2.5 || ^5.0.0-beta"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
import { Provider, NgModule, Inject } from '@angular/core';
|
||||||
|
import { Headers, Http, ResponseOptions, RequestOptionsArgs, Response } from '@angular/http';
|
||||||
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
import 'rxjs/add/observable/of';
|
||||||
|
import 'rxjs/add/operator/map';
|
||||||
|
const globalSerializedStateKey = 'HTTP_STATE_TRANSFER';
|
||||||
|
const backingStoreDIToken = 'HTTP_STATE_BACKING_STORE';
|
||||||
|
|
||||||
|
export interface CacheOptions {
|
||||||
|
permanent: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CachedHttpResponse {
|
||||||
|
headers: { [name: string]: any } | null;
|
||||||
|
status: number;
|
||||||
|
statusText: string | null;
|
||||||
|
text: string;
|
||||||
|
url: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type BackingStore = { [key: string]: CachedHttpResponse };
|
||||||
|
|
||||||
|
export class HttpWithStateTransfer {
|
||||||
|
private backingStore: BackingStore;
|
||||||
|
private http: Http;
|
||||||
|
|
||||||
|
constructor(@Inject(Http) http: Http, @Inject(backingStoreDIToken) backingStore: BackingStore) {
|
||||||
|
this.http = http;
|
||||||
|
this.backingStore = backingStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
public stateForTransfer(): any {
|
||||||
|
return { [globalSerializedStateKey]: this.backingStore };
|
||||||
|
}
|
||||||
|
|
||||||
|
public get(url: string, options?: CacheOptions, requestOptions?: RequestOptionsArgs): Observable<Response> {
|
||||||
|
return this.getCachedResponse(/* cacheKey */ url, () => this.http.get(url, requestOptions), options);
|
||||||
|
}
|
||||||
|
|
||||||
|
private getCachedResponse(cacheKey: string, provider: () => Observable<Response>, options?: CacheOptions): Observable<Response> {
|
||||||
|
// By default, the cache is only used for the *first* client-side read. So, we're only performing
|
||||||
|
// a one-time transfer of server-side response to the client. If you want to keep and reuse cached
|
||||||
|
// responses continually during server-side and client-side execution, set 'permanent' to 'true.
|
||||||
|
const isClient = typeof window !== 'undefined';
|
||||||
|
const isPermanent = options && options.permanent;
|
||||||
|
|
||||||
|
const allowReadFromCache = isClient || isPermanent;
|
||||||
|
if (allowReadFromCache && this.backingStore.hasOwnProperty(cacheKey)) {
|
||||||
|
const cachedValue = this.backingStore[cacheKey];
|
||||||
|
if (!isPermanent) {
|
||||||
|
delete this.backingStore[cacheKey];
|
||||||
|
}
|
||||||
|
return Observable.of(new Response(new ResponseOptions({
|
||||||
|
body: cachedValue.text,
|
||||||
|
headers: new Headers(cachedValue.headers),
|
||||||
|
status: cachedValue.status,
|
||||||
|
url: cachedValue.url
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider()
|
||||||
|
.map(response => {
|
||||||
|
const allowWriteToCache = !isClient || isPermanent;
|
||||||
|
if (allowWriteToCache) {
|
||||||
|
this.backingStore[cacheKey] = {
|
||||||
|
headers: response.headers ? response.headers.toJSON() : null,
|
||||||
|
status: response.status,
|
||||||
|
statusText: response.statusText,
|
||||||
|
text: response.text(),
|
||||||
|
url: response.url
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return response;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function defaultBackingStoreFactory() {
|
||||||
|
const transferredData = typeof window !== 'undefined' ? (window as any)[globalSerializedStateKey] : null;
|
||||||
|
return transferredData || {};
|
||||||
|
}
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
providers: [
|
||||||
|
// The backing store is a separate DI service so you could override exactly how it gets
|
||||||
|
// transferred from server to client
|
||||||
|
{ provide: backingStoreDIToken, useFactory: defaultBackingStoreFactory },
|
||||||
|
|
||||||
|
{ provide: HttpWithStateTransfer, useClass: HttpWithStateTransfer },
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class HttpWithStateTransferModule {
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from './HttpWithStateTransfer';
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"module": "commonjs",
|
||||||
|
"target": "es5",
|
||||||
|
"declaration": true,
|
||||||
|
"outDir": ".",
|
||||||
|
"lib": ["es2015", "dom"]
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/index.ts"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"node_modules"
|
||||||
|
],
|
||||||
|
"angularCompilerOptions": {
|
||||||
|
"genDir": "compiled"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||||
<metadata>
|
<metadata>
|
||||||
<id>Microsoft.AspNetCore.SpaTemplates</id>
|
<id>Microsoft.AspNetCore.SpaTemplates</id>
|
||||||
<version>{yeomanversion}</version>
|
<version>0.0.0</version>
|
||||||
<description>Single Page Application templates for ASP.NET Core</description>
|
<description>Single Page Application templates for ASP.NET Core</description>
|
||||||
<authors>Microsoft</authors>
|
<authors>Microsoft</authors>
|
||||||
<language>en-US</language>
|
<language>en-US</language>
|
||||||
@@ -14,4 +14,10 @@
|
|||||||
<packageType name="Template" />
|
<packageType name="Template" />
|
||||||
</packageTypes>
|
</packageTypes>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<files>
|
||||||
|
<file
|
||||||
|
src="**/*"
|
||||||
|
exclude="*/node_modules/**;*/bin/**;*/obj/**;*/ClientApp/dist/**;*/wwwroot/dist/**"
|
||||||
|
target="Content" />
|
||||||
|
</files>
|
||||||
</package>
|
</package>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json.schemastore.org/dotnetcli.host",
|
||||||
|
"symbolInfo": {
|
||||||
|
"TargetFrameworkOverride": {
|
||||||
|
"isHidden": "true",
|
||||||
|
"longName": "target-framework-override",
|
||||||
|
"shortName": ""
|
||||||
|
},
|
||||||
|
"Framework": {
|
||||||
|
"longName": "framework"
|
||||||
|
},
|
||||||
|
"skipRestore": {
|
||||||
|
"longName": "no-restore",
|
||||||
|
"shortName": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
@@ -0,0 +1,87 @@
|
|||||||
|
{
|
||||||
|
"author": "Microsoft",
|
||||||
|
"classifications": [
|
||||||
|
"Web",
|
||||||
|
"MVC",
|
||||||
|
"SPA"
|
||||||
|
],
|
||||||
|
"groupIdentity": "Microsoft.AspNetCore.SpaTemplates.Aurelia",
|
||||||
|
"identity": "Microsoft.AspNetCore.SpaTemplates.Aurelia.CSharp",
|
||||||
|
"name": "ASP.NET Core with Aurelia",
|
||||||
|
"preferNameDirectory": true,
|
||||||
|
"primaryOutputs": [
|
||||||
|
{
|
||||||
|
"path": "AureliaSpa.csproj"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"shortName": "aurelia",
|
||||||
|
"sourceName": "AureliaSpa",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"source": "./",
|
||||||
|
"target": "./",
|
||||||
|
"exclude": [
|
||||||
|
".template.config/**"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"symbols": {
|
||||||
|
"TargetFrameworkOverride": {
|
||||||
|
"type": "parameter",
|
||||||
|
"description": "Overrides the target framework",
|
||||||
|
"replaces": "TargetFrameworkOverride",
|
||||||
|
"datatype": "string",
|
||||||
|
"defaultValue": ""
|
||||||
|
},
|
||||||
|
"Framework": {
|
||||||
|
"type": "parameter",
|
||||||
|
"description": "The target framework for the project.",
|
||||||
|
"datatype": "choice",
|
||||||
|
"choices": [
|
||||||
|
{
|
||||||
|
"choice": "netcoreapp2.0",
|
||||||
|
"description": "Target netcoreapp2.0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"replaces": "netcoreapp2.0",
|
||||||
|
"defaultValue": "netcoreapp2.0"
|
||||||
|
},
|
||||||
|
"HostIdentifier": {
|
||||||
|
"type": "bind",
|
||||||
|
"binding": "HostIdentifier"
|
||||||
|
},
|
||||||
|
"skipRestore": {
|
||||||
|
"type": "parameter",
|
||||||
|
"datatype": "bool",
|
||||||
|
"description": "If specified, skips the automatic restore of the project on create.",
|
||||||
|
"defaultValue": "false"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"language": "C#",
|
||||||
|
"type": "project"
|
||||||
|
},
|
||||||
|
"postActions": [
|
||||||
|
{
|
||||||
|
"condition": "(!skipRestore)",
|
||||||
|
"description": "Restore NuGet packages required by this project.",
|
||||||
|
"manualInstructions": [
|
||||||
|
{
|
||||||
|
"text": "Run 'dotnet restore'"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
|
||||||
|
"continueOnError": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "(HostIdentifier == \"dotnetcli\" || HostIdentifier == \"dotnetcli-preview\")",
|
||||||
|
"actionId": "AC1156F7-BB77-4DB8-B28F-24EEBCCA1E5C",
|
||||||
|
"description": "\n\n-------------------------------------------------------------------\nIMPORTANT: Before running this project on the command line,\n you must restore NPM packages by running \"npm install\"\n-------------------------------------------------------------------\n",
|
||||||
|
"manualInstructions": [
|
||||||
|
{
|
||||||
|
"text": "Run \"npm install\""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json.schemastore.org/vs-2017.3.host",
|
||||||
|
"name": {
|
||||||
|
"text": "Aurelia",
|
||||||
|
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
|
||||||
|
"id": "1200"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"text": "A project template for creating an ASP.NET Core application with Aurelia",
|
||||||
|
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
|
||||||
|
"id": "1201"
|
||||||
|
},
|
||||||
|
"order": 301,
|
||||||
|
"icon": "icon.png",
|
||||||
|
"learnMoreLink": "https://github.com/aspnet/JavaScriptServices",
|
||||||
|
"uiFilters": [
|
||||||
|
"oneaspnet"
|
||||||
|
],
|
||||||
|
"minFullFrameworkVersion": "4.6.1"
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
</button>
|
</button>
|
||||||
<a class="navbar-brand" href="#/home">WebApplicationBasic</a>
|
<a class="navbar-brand" href="#/home">AureliaSpa</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
<div class="navbar-collapse collapse">
|
<div class="navbar-collapse collapse">
|
||||||
@@ -5,7 +5,7 @@ using System.Linq;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace WebApplicationBasic.Controllers
|
namespace AureliaSpa.Controllers
|
||||||
{
|
{
|
||||||
public class HomeController : Controller
|
public class HomeController : Controller
|
||||||
{
|
{
|
||||||
@@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace WebApplicationBasic.Controllers
|
namespace AureliaSpa.Controllers
|
||||||
{
|
{
|
||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
public class SampleDataController : Controller
|
public class SampleDataController : Controller
|
||||||
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Hosting;
|
|||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace WebApplicationBasic
|
namespace AureliaSpa
|
||||||
{
|
{
|
||||||
public class Program
|
public class Program
|
||||||
{
|
{
|
||||||
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.SpaServices.Webpack;
|
|||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace WebApplicationBasic
|
namespace AureliaSpa
|
||||||
{
|
{
|
||||||
public class Startup
|
public class Startup
|
||||||
{
|
{
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>@ViewData["Title"] - WebApplicationBasic</title>
|
<title>@ViewData["Title"] - AureliaSpa</title>
|
||||||
<base href="~/" />
|
<base href="~/" />
|
||||||
|
|
||||||
<link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" />
|
<link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" />
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
@using WebApplicationBasic
|
@using AureliaSpa
|
||||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
@addTagHelper *, Microsoft.AspNetCore.SpaServices
|
@addTagHelper *, Microsoft.AspNetCore.SpaServices
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "WebApplicationBasic",
|
"name": "AureliaSpa",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/webpack-env": {
|
"@types/webpack-env": {
|
||||||
@@ -1,26 +1,24 @@
|
|||||||
{
|
{
|
||||||
"name": "WebApplicationBasic",
|
"name": "AureliaSpa",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"devDependencies": {
|
||||||
|
"@types/webpack-env": "^1.13.0",
|
||||||
|
"aspnet-webpack": "^2.0.1",
|
||||||
"aurelia-bootstrapper": "^2.0.1",
|
"aurelia-bootstrapper": "^2.0.1",
|
||||||
"aurelia-fetch-client": "^1.0.1",
|
"aurelia-fetch-client": "^1.0.1",
|
||||||
"aurelia-framework": "^1.1.0",
|
"aurelia-framework": "^1.1.0",
|
||||||
"aurelia-loader-webpack": "^2.0.0",
|
"aurelia-loader-webpack": "^2.0.0",
|
||||||
"aurelia-pal": "^1.3.0",
|
"aurelia-pal": "^1.3.0",
|
||||||
"aurelia-router": "^1.2.1",
|
"aurelia-router": "^1.2.1",
|
||||||
"bootstrap": "^3.3.7",
|
|
||||||
"isomorphic-fetch": "^2.2.1",
|
|
||||||
"jquery": "^3.2.1"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/webpack-env": "^1.13.0",
|
|
||||||
"aspnet-webpack": "^2.0.1",
|
|
||||||
"aurelia-webpack-plugin": "^2.0.0-rc.2",
|
"aurelia-webpack-plugin": "^2.0.0-rc.2",
|
||||||
|
"bootstrap": "^3.3.7",
|
||||||
"css-loader": "^0.28.0",
|
"css-loader": "^0.28.0",
|
||||||
"extract-text-webpack-plugin": "^2.1.0",
|
"extract-text-webpack-plugin": "^2.1.0",
|
||||||
"file-loader": "^0.11.1",
|
"file-loader": "^0.11.1",
|
||||||
"html-loader": "^0.4.5",
|
"html-loader": "^0.4.5",
|
||||||
|
"isomorphic-fetch": "^2.2.1",
|
||||||
|
"jquery": "^3.2.1",
|
||||||
"json-loader": "^0.5.4",
|
"json-loader": "^0.5.4",
|
||||||
"style-loader": "^0.16.1",
|
"style-loader": "^0.16.1",
|
||||||
"ts-loader": "^2.0.3",
|
"ts-loader": "^2.0.3",
|
||||||
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 83 KiB |
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json.schemastore.org/dotnetcli.host",
|
||||||
|
"symbolInfo": {
|
||||||
|
"TargetFrameworkOverride": {
|
||||||
|
"isHidden": "true",
|
||||||
|
"longName": "target-framework-override",
|
||||||
|
"shortName": ""
|
||||||
|
},
|
||||||
|
"Framework": {
|
||||||
|
"longName": "framework"
|
||||||
|
},
|
||||||
|
"skipRestore": {
|
||||||
|
"longName": "no-restore",
|
||||||
|
"shortName": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
@@ -0,0 +1,87 @@
|
|||||||
|
{
|
||||||
|
"author": "Microsoft",
|
||||||
|
"classifications": [
|
||||||
|
"Web",
|
||||||
|
"MVC",
|
||||||
|
"SPA"
|
||||||
|
],
|
||||||
|
"groupIdentity": "Microsoft.AspNetCore.SpaTemplates.Knockout",
|
||||||
|
"identity": "Microsoft.AspNetCore.SpaTemplates.Knockout.CSharp",
|
||||||
|
"name": "ASP.NET Core with Knockout.js",
|
||||||
|
"preferNameDirectory": true,
|
||||||
|
"primaryOutputs": [
|
||||||
|
{
|
||||||
|
"path": "KnockoutSpa.csproj"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"shortName": "knockout",
|
||||||
|
"sourceName": "KnockoutSpa",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"source": "./",
|
||||||
|
"target": "./",
|
||||||
|
"exclude": [
|
||||||
|
".template.config/**"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"symbols": {
|
||||||
|
"TargetFrameworkOverride": {
|
||||||
|
"type": "parameter",
|
||||||
|
"description": "Overrides the target framework",
|
||||||
|
"replaces": "TargetFrameworkOverride",
|
||||||
|
"datatype": "string",
|
||||||
|
"defaultValue": ""
|
||||||
|
},
|
||||||
|
"Framework": {
|
||||||
|
"type": "parameter",
|
||||||
|
"description": "The target framework for the project.",
|
||||||
|
"datatype": "choice",
|
||||||
|
"choices": [
|
||||||
|
{
|
||||||
|
"choice": "netcoreapp2.0",
|
||||||
|
"description": "Target netcoreapp2.0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"replaces": "netcoreapp2.0",
|
||||||
|
"defaultValue": "netcoreapp2.0"
|
||||||
|
},
|
||||||
|
"HostIdentifier": {
|
||||||
|
"type": "bind",
|
||||||
|
"binding": "HostIdentifier"
|
||||||
|
},
|
||||||
|
"skipRestore": {
|
||||||
|
"type": "parameter",
|
||||||
|
"datatype": "bool",
|
||||||
|
"description": "If specified, skips the automatic restore of the project on create.",
|
||||||
|
"defaultValue": "false"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"language": "C#",
|
||||||
|
"type": "project"
|
||||||
|
},
|
||||||
|
"postActions": [
|
||||||
|
{
|
||||||
|
"condition": "(!skipRestore)",
|
||||||
|
"description": "Restore NuGet packages required by this project.",
|
||||||
|
"manualInstructions": [
|
||||||
|
{
|
||||||
|
"text": "Run 'dotnet restore'"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
|
||||||
|
"continueOnError": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "(HostIdentifier == \"dotnetcli\" || HostIdentifier == \"dotnetcli-preview\")",
|
||||||
|
"actionId": "AC1156F7-BB77-4DB8-B28F-24EEBCCA1E5C",
|
||||||
|
"description": "\n\n-------------------------------------------------------------------\nIMPORTANT: Before running this project on the command line,\n you must restore NPM packages by running \"npm install\"\n-------------------------------------------------------------------\n",
|
||||||
|
"manualInstructions": [
|
||||||
|
{
|
||||||
|
"text": "Run \"npm install\""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json.schemastore.org/vs-2017.3.host",
|
||||||
|
"name": {
|
||||||
|
"text": "Knockout.js",
|
||||||
|
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
|
||||||
|
"id": "1300"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"text": "A project template for creating an ASP.NET Core application with Knockout.js",
|
||||||
|
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
|
||||||
|
"id": "1301"
|
||||||
|
},
|
||||||
|
"order": 301,
|
||||||
|
"icon": "icon.png",
|
||||||
|
"learnMoreLink": "https://github.com/aspnet/JavaScriptServices",
|
||||||
|
"uiFilters": [
|
||||||
|
"oneaspnet"
|
||||||
|
],
|
||||||
|
"minFullFrameworkVersion": "4.6.1"
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<span class='icon-bar'></span>
|
<span class='icon-bar'></span>
|
||||||
<span class='icon-bar'></span>
|
<span class='icon-bar'></span>
|
||||||
</button>
|
</button>
|
||||||
<a class='navbar-brand' href='/'>WebApplicationBasic</a>
|
<a class='navbar-brand' href='/'>KnockoutSpa</a>
|
||||||
</div>
|
</div>
|
||||||
<div class='clearfix'></div>
|
<div class='clearfix'></div>
|
||||||
<div class='navbar-collapse collapse'>
|
<div class='navbar-collapse collapse'>
|
||||||
0
templates/KnockoutSpa/ClientApp/css/site.css → templates/Microsoft.AspNetCore.SpaTemplates/knockout/ClientApp/css/site.css
Executable file → Normal file
@@ -43,8 +43,7 @@ export class Router {
|
|||||||
$(document).on('click', 'a', this.clickEventListener);
|
$(document).on('click', 'a', this.clickEventListener);
|
||||||
|
|
||||||
// Initialize Crossroads with starting location
|
// Initialize Crossroads with starting location
|
||||||
// Need to cast history to 'any' because @types/history is out-of-date
|
crossroads.parse(history.location.pathname);
|
||||||
crossroads.parse((history as any).location.pathname);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public link(url: string): string {
|
public link(url: string): string {
|
||||||
@@ -5,7 +5,7 @@ using System.Linq;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace WebApplicationBasic.Controllers
|
namespace KnockoutSpa.Controllers
|
||||||
{
|
{
|
||||||
public class HomeController : Controller
|
public class HomeController : Controller
|
||||||
{
|
{
|
||||||
@@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace WebApplicationBasic.Controllers
|
namespace KnockoutSpa.Controllers
|
||||||
{
|
{
|
||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
public class SampleDataController : Controller
|
public class SampleDataController : Controller
|
||||||
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Hosting;
|
|||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace WebApplicationBasic
|
namespace KnockoutSpa
|
||||||
{
|
{
|
||||||
public class Program
|
public class Program
|
||||||
{
|
{
|
||||||
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.SpaServices.Webpack;
|
|||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace WebApplicationBasic
|
namespace KnockoutSpa
|
||||||
{
|
{
|
||||||
public class Startup
|
public class Startup
|
||||||
{
|
{
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>@ViewData["Title"] - WebApplicationBasic</title>
|
<title>@ViewData["Title"] - KnockoutSpa</title>
|
||||||
<base href="~/" />
|
<base href="~/" />
|
||||||
|
|
||||||
<link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" />
|
<link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" />
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
@using WebApplicationBasic
|
@using KnockoutSpa
|
||||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
@addTagHelper *, Microsoft.AspNetCore.SpaServices
|
@addTagHelper *, Microsoft.AspNetCore.SpaServices
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "WebApplicationBasic",
|
"name": "KnockoutSpa",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/core-js": {
|
"@types/core-js": {
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "WebApplicationBasic",
|
"name": "KnockoutSpa",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json.schemastore.org/dotnetcli.host",
|
||||||
|
"symbolInfo": {
|
||||||
|
"TargetFrameworkOverride": {
|
||||||
|
"isHidden": "true",
|
||||||
|
"longName": "target-framework-override",
|
||||||
|
"shortName": ""
|
||||||
|
},
|
||||||
|
"Framework": {
|
||||||
|
"longName": "framework"
|
||||||
|
},
|
||||||
|
"skipRestore": {
|
||||||
|
"longName": "no-restore",
|
||||||
|
"shortName": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,87 @@
|
|||||||
|
{
|
||||||
|
"author": "Microsoft",
|
||||||
|
"classifications": [
|
||||||
|
"Web",
|
||||||
|
"MVC",
|
||||||
|
"SPA"
|
||||||
|
],
|
||||||
|
"groupIdentity": "Microsoft.AspNetCore.SpaTemplates.Vue",
|
||||||
|
"identity": "Microsoft.AspNetCore.SpaTemplates.Vue.CSharp",
|
||||||
|
"name": "ASP.NET Core with Vue.js",
|
||||||
|
"preferNameDirectory": true,
|
||||||
|
"primaryOutputs": [
|
||||||
|
{
|
||||||
|
"path": "VueSpa.csproj"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"shortName": "vue",
|
||||||
|
"sourceName": "VueSpa",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"source": "./",
|
||||||
|
"target": "./",
|
||||||
|
"exclude": [
|
||||||
|
".template.config/**"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"symbols": {
|
||||||
|
"TargetFrameworkOverride": {
|
||||||
|
"type": "parameter",
|
||||||
|
"description": "Overrides the target framework",
|
||||||
|
"replaces": "TargetFrameworkOverride",
|
||||||
|
"datatype": "string",
|
||||||
|
"defaultValue": ""
|
||||||
|
},
|
||||||
|
"Framework": {
|
||||||
|
"type": "parameter",
|
||||||
|
"description": "The target framework for the project.",
|
||||||
|
"datatype": "choice",
|
||||||
|
"choices": [
|
||||||
|
{
|
||||||
|
"choice": "netcoreapp2.0",
|
||||||
|
"description": "Target netcoreapp2.0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"replaces": "netcoreapp2.0",
|
||||||
|
"defaultValue": "netcoreapp2.0"
|
||||||
|
},
|
||||||
|
"HostIdentifier": {
|
||||||
|
"type": "bind",
|
||||||
|
"binding": "HostIdentifier"
|
||||||
|
},
|
||||||
|
"skipRestore": {
|
||||||
|
"type": "parameter",
|
||||||
|
"datatype": "bool",
|
||||||
|
"description": "If specified, skips the automatic restore of the project on create.",
|
||||||
|
"defaultValue": "false"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"language": "C#",
|
||||||
|
"type": "project"
|
||||||
|
},
|
||||||
|
"postActions": [
|
||||||
|
{
|
||||||
|
"condition": "(!skipRestore)",
|
||||||
|
"description": "Restore NuGet packages required by this project.",
|
||||||
|
"manualInstructions": [
|
||||||
|
{
|
||||||
|
"text": "Run 'dotnet restore'"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
|
||||||
|
"continueOnError": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "(HostIdentifier == \"dotnetcli\" || HostIdentifier == \"dotnetcli-preview\")",
|
||||||
|
"actionId": "AC1156F7-BB77-4DB8-B28F-24EEBCCA1E5C",
|
||||||
|
"description": "\n\n-------------------------------------------------------------------\nIMPORTANT: Before running this project on the command line,\n you must restore NPM packages by running \"npm install\"\n-------------------------------------------------------------------\n",
|
||||||
|
"manualInstructions": [
|
||||||
|
{
|
||||||
|
"text": "Run \"npm install\""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json.schemastore.org/vs-2017.3.host",
|
||||||
|
"name": {
|
||||||
|
"text": "Vue.js",
|
||||||
|
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
|
||||||
|
"id": "1600"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"text": "A project template for creating an ASP.NET Core application with Vue.js",
|
||||||
|
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
|
||||||
|
"id": "1601"
|
||||||
|
},
|
||||||
|
"order": 301,
|
||||||
|
"icon": "icon.png",
|
||||||
|
"learnMoreLink": "https://github.com/aspnet/JavaScriptServices",
|
||||||
|
"uiFilters": [
|
||||||
|
"oneaspnet"
|
||||||
|
],
|
||||||
|
"minFullFrameworkVersion": "4.6.1"
|
||||||
|
}
|
||||||