Downloads:
8,259
Downloads of v 2019.01.22:
276
Last Update:
23 Jan 2019
Package Maintainer(s):
Software Author(s):
- Bill Curran
Tags:
(unofficial) Chocolatey .nuspec Checker (Script)
This is not the latest version of (unofficial) Chocolatey .nuspec Checker (Script) available.
- 1
- 2
- 3
2019.01.22 | Updated: 23 Jan 2019
Downloads:
8,259
Downloads of v 2019.01.22:
276
Maintainer(s):
Software Author(s):
- Bill Curran
(unofficial) Chocolatey .nuspec Checker (Script) 2019.01.22
This is not the latest version of (unofficial) Chocolatey .nuspec Checker (Script) available.
Legal Disclaimer: Neither this package nor Chocolatey Software, Inc. are affiliated with or endorsed by Bill Curran. The inclusion of Bill Curran trademark(s), if any, upon this webpage is solely to identify Bill Curran goods or services and not for commercial purposes.
- 1
- 2
- 3
All Checks are Passing
3 Passing Tests
Deployment Method: Individual Install, Upgrade, & Uninstall
To install (unofficial) Chocolatey .nuspec Checker (Script), run the following command from the command line or from PowerShell:
To upgrade (unofficial) Chocolatey .nuspec Checker (Script), run the following command from the command line or from PowerShell:
To uninstall (unofficial) Chocolatey .nuspec Checker (Script), run the following command from the command line or from PowerShell:
Deployment Method:
This applies to both open source and commercial editions of Chocolatey.
1. Enter Your Internal Repository Url
(this should look similar to https://community.chocolatey.org/api/v2/)
2. Setup Your Environment
1. Ensure you are set for organizational deployment
Please see the organizational deployment guide
2. Get the package into your environment
Option 1: Cached Package (Unreliable, Requires Internet - Same As Community)-
Open Source or Commercial:
- Proxy Repository - Create a proxy nuget repository on Nexus, Artifactory Pro, or a proxy Chocolatey repository on ProGet. Point your upstream to https://community.chocolatey.org/api/v2/. Packages cache on first access automatically. Make sure your choco clients are using your proxy repository as a source and NOT the default community repository. See source command for more information.
- You can also just download the package and push it to a repository Download
-
Open Source
-
Download the package:
Download - Follow manual internalization instructions
-
-
Package Internalizer (C4B)
-
Run: (additional options)
choco download choco-nuspec-checker --internalize --version=2019.01.22 --source=https://community.chocolatey.org/api/v2/
-
For package and dependencies run:
choco push --source="'INTERNAL REPO URL'"
- Automate package internalization
-
Run: (additional options)
3. Copy Your Script
choco upgrade choco-nuspec-checker -y --source="'INTERNAL REPO URL'" --version="'2019.01.22'" [other options]
See options you can pass to upgrade.
See best practices for scripting.
Add this to a PowerShell script or use a Batch script with tools and in places where you are calling directly to Chocolatey. If you are integrating, keep in mind enhanced exit codes.
If you do use a PowerShell script, use the following to ensure bad exit codes are shown as failures:
choco upgrade choco-nuspec-checker -y --source="'INTERNAL REPO URL'" --version="'2019.01.22'"
$exitCode = $LASTEXITCODE
Write-Verbose "Exit code was $exitCode"
$validExitCodes = @(0, 1605, 1614, 1641, 3010)
if ($validExitCodes -contains $exitCode) {
Exit 0
}
Exit $exitCode
- name: Install choco-nuspec-checker
win_chocolatey:
name: choco-nuspec-checker
version: '2019.01.22'
source: INTERNAL REPO URL
state: present
See docs at https://docs.ansible.com/ansible/latest/modules/win_chocolatey_module.html.
chocolatey_package 'choco-nuspec-checker' do
action :install
source 'INTERNAL REPO URL'
version '2019.01.22'
end
See docs at https://docs.chef.io/resource_chocolatey_package.html.
cChocoPackageInstaller choco-nuspec-checker
{
Name = "choco-nuspec-checker"
Version = "2019.01.22"
Source = "INTERNAL REPO URL"
}
Requires cChoco DSC Resource. See docs at https://github.com/chocolatey/cChoco.
package { 'choco-nuspec-checker':
ensure => '2019.01.22',
provider => 'chocolatey',
source => 'INTERNAL REPO URL',
}
Requires Puppet Chocolatey Provider module. See docs at https://forge.puppet.com/puppetlabs/chocolatey.
4. If applicable - Chocolatey configuration/installation
See infrastructure management matrix for Chocolatey configuration elements and examples.
This package was approved by moderator gep13 on 25 Jan 2019.
choco://choco-nuspec-checker
To use choco:// protocol URLs, install (unofficial) choco:// Protocol support
choco-nuspec-checker (CNC) is a PowerShell script designed for Chocolatey package maintainers/creators to check Chocolatey .nuspec files for common errors and ommisions. Find out what the Chocolatey validator is going to tell you BEFORE you submit your package.
FEATURES:
- CNC checks for all .nuspec elements and reports any missing
- CNC checks for all verifier messages (guidelines, suggestions, and notes) and reports them if applicable
- CNC checks for UTF-8 encoding and reports the type of encoding if not UTF-8
- CNC checks for dead URLs and reports them
- CNC checks for GitHub direct links, reports them, and can convert to Staticaly CDN URLs
- CNC checks for RawGit CDN links, reports them, and can convert to Staticaly CDN URLs
- CNC can open all your .nuspec element URLs in your default browser for quick viewing
- CNC can add a standard template header and/or footer to your .nuspec description (saving coming soon)
Helps make packaging Chocolateasy!
INSTRUCTIONS:
- CNC -help for help with options and switches
- Run CNC to check the .nuspec in your current directory, run CNC X:\SOMEWHERE to check the .nuspec in that directory. (Do not specify the file itself, just the directory.)
- To check all your packages' .nuspec files change to the root directory of all your packages and via PowerShell run Get-ChildItem -Recurse | ?{if ($.PSIsContainer){cls;cd $.Name;cnc;cd ..;pause}}
If you find choco-nuspec-checker useful please consider donating: https://www.paypal.me/bcurran3donations or become a patron at https://www.patreon.com/bcurran3
$packageName = 'choco-nuspec-checker'
$script = 'CNC.ps1'
$CNCHeader = 'CNCHeader.txt'
$CNCFooter = 'CNCFooter.txt'
Remove-Item "$ENV:ChocolateyInstall\bin\$script" -Force | Out-Null
Remove-Item "$ENV:ChocolateyInstall\bin\$CNCHeader" -Force -ErrorAction SilentlyContinue | Out-Null
Remove-Item "$ENV:ChocolateyInstall\bin\$CNCFooter" -Force -ErrorAction SilentlyContinue | Out-Null
# CNC.ps1 Copyleft 2018-2019 by Bill Curran AKA BCURRAN3
# LICENSE: GNU GPL v3 - https://www.gnu.org/licenses/gpl.html
# Open a GitHub issue at https://github.com/bcurran3/ChocolateyPackages/issues if you have suggestions for improvement.
# REF: https://docs.microsoft.com/en-us/nuget/reference/nuspec
# REF: https://github.com/chocolatey/package-validator/wiki
param (
[string]$path=(Get-Location)
)
Write-Host "CNC.ps1 v2019.01.22 - (unofficial) Chocolatey .nuspec Checker ""CNC - Run it through the Bill.""" -ForeGroundColor White
Write-Host "Copyleft 2018-2019 Bill Curran ([email protected]) - free for personal and commercial use" -ForeGroundColor White
Write-Host
$AcceptableIconExts=@("png","svg")
$BinaryExtensions=@("*.exe","*.msi","*.zip","*.rar","*.7z","*.gz","*.tar","*.sfx","*.iso","*.img","*.msu","*.msp","*.appx","*.appxbundle") # miss any?
$CDNlist = "https://www.staticaly.com, https://raw.githack.com, https://gitcdn.link, or https://www.jsdelivr.com"
$CNCHeader = "$ENV:ChocolateyInstall\bin\CNCHeader.txt"
$CNCFooter = "$ENV:ChocolateyInstall\bin\CNCFooter.txt"
#if ($path='\') {$path=(Get-Location).Drive.Name + ":" + $path}
if (!(Test-Path $path)){
Write-Host " ** $path is an invalid path." -ForeGround Red
return
# $path=Get-Location
# Write-Host " ** Changing path to $path."
}
if (($args -eq "-help") -or ($args -eq "-?") -or ($args -eq "/?")) {
Write-Host "OPTIONS AND SWITCHES:" -ForeGround Magenta
Write-Host
Write-Host "-help, -?, or /?"
Write-Host " Displays this information."
Write-Host "-AddFooter (saving not implemented yet)"
Write-Host " Adds a footer ($CNCFooter) to your .nuspec file and saves it."
Write-Host "-AddHeader (saving not implemented yet)"
Write-Host " Adds a header ($CNCHeader) to your .nuspec file and saves it."
Write-Host "-EditFooter"
Write-Host " Edit $CNCFooter with Notepad++ or Notepad."
Write-Host "-EditHeader"
Write-Host " Edit $CNCHeader with Notepad++ or Notepad."
Write-Host "-OpenURLs"
Write-Host " Open all URLs in your browser for inspection when finished."
Write-Host "-OpenValidatorInfo"
Write-Host " Open the Chocolatey package-validator info page on GitHub in your default browser."
Write-Host "-ShowFooter"
Write-Host " Displays $CNCFooter."
Write-Host "-ShowHeader"
Write-Host " Displays $CNCHeader."
Write-Host "-UpdateImageURLs"
Write-Host " Updates image URLs with Staticaly CDN URLs."
Write-Host
Write-Host "To check all your packages' .nuspec files: Change to the root directory of your packages and run (via PowerShell):"
Write-Host 'Get-ChildItem -Recurse | ?{if ($_.PSIsContainer){cls;cd $_.Name;cnc;cd ..;pause}}'
return
}
if (Test-Path $ENV:ChocolateyInstall\bin\notepad++.exe){
$Editor="notepad++.exe"
} else {
$Editor="notepad.exe"
}
if ($args -eq "-EditFooter") {
Write-Host " ** Editing contents of $CNCFooter." -ForeGround Magenta
&$Editor $CNCFooter
return
}
if ($args -eq "-EditHeader") {
Write-Host " ** Editing contents of $CNCHeader." -ForeGround Magenta
&$Editor $CNCHeader
return
}
if ($args -eq "-ShowFooter") {
Write-Host " ** Displaying contents of $CNCFooter." -ForeGround Magenta
Write-Host
Get-Content $CNCFooter
return
}
if ($args -eq "-ShowHeader") {
Write-Host " ** Displaying contents of $CNCHeader." -ForeGround Magenta
Write-Host
Get-Content $CNCHeader
return
}
if ($args -eq "-OpenValidatorInfo") {
Write-Host " ** Opening https://github.com/chocolatey/package-validator/wiki." -ForeGround Magenta
Write-Host
&start https://github.com/chocolatey/package-validator/wiki
return
}
# NOT implemented yet
if ($args -eq "-Recurse") {
$Recurse=$True
return
}
# Let's you specify a folder to find a .nuspec file
# Do NOT specify the file itself, just the folder.
# Defaults to current working directory.
if (!$path) {$LocalnuspecFile = Get-Item ./*.nuspec}
if ($path) {$LocalnuspecFile = Get-Item $path\*.nuspec}
if (!($LocalnuspecFile)) {
$CurrentDir=$path
Write-Host " ** No .nuspec file found in $CurrentDir" -ForeGround Red
return
}
# borrowed from https://blogs.technet.microsoft.com/samdrey/2014/03/26/determine-the-file-encoding-of-a-file-csv-file-with-french-accents-or-other-exotic-characters-that-youre-trying-to-import-in-powershell/
# UTF8 w/o BOM sometimes reports as ASCI. UTF8 w/BOM is not desired per "You must save your files with UTF–8 character encoding without BOM."
function Get-FileEncoding
{
[CmdletBinding()] Param (
[Parameter(Mandatory = $True, ValueFromPipelineByPropertyName = $True)] [string]$Path
)
[byte[]]$byte = get-content -Encoding byte -ReadCount 4 -TotalCount 4 -Path $Path
if ( $byte[0] -eq 0xef -and $byte[1] -eq 0xbb -and $byte[2] -eq 0xbf )
{ Write-Output 'UTF8' }
elseif ($byte[0] -eq 0xfe -and $byte[1] -eq 0xff)
{ Write-Output 'Unicode' }
elseif ($byte[0] -eq 0 -and $byte[1] -eq 0 -and $byte[2] -eq 0xfe -and $byte[3] -eq 0xff)
{ Write-Output 'UTF32' }
elseif ($byte[0] -eq 0x2b -and $byte[1] -eq 0x2f -and $byte[2] -eq 0x76)
{ Write-Output 'UTF7'}
else
{ Write-Output 'ASCII (probably UTF8)' }
}
# Validate that URL elements are actually URLs and verify the URLs are good
# Thanks https://stackoverflow.com/questions/23760070/the-remote-server-returned-an-error-401-unauthorized
function Validate-URL([string]$element,[string]$url){
if (($url -match "http://") -or ($url -match "https://")){
$HTTP_Response = $null
$HTTP_Request = [System.Net.WebRequest]::Create($url)
try{
$HTTP_Response = $HTTP_Request.GetResponse()
$HTTP_Status = [int]$HTTP_Response.StatusCode
if ($HTTP_Status -eq 200) {
# do nothing, it's good!
} else {
Write-Host (" ** $element - $url site might be OK, status code:" + $HTTP_Status)
Write-Host " ** Consider using CNC's -OpenURLs option to open and view all URLs in the .nuspec." -ForeGround Cyan
}
$HTTP_Response.Close()
} catch {
$HTTP_Status = [regex]::matches($_.exception.message, "(?<=\()[\d]{3}").Value
Write-Warning (" ** $element - ""$url"" is probably bad, status code: " + $HTTP_Status)
Write-Host " ** Consider using CNC's -OpenURLs option to open and view all URLs in the .nuspec." -ForeGround Cyan
}
}
}
# Check for license files when binaries are included
function Check-LicenseFile{
$LicenseFile=(Get-ChildItem -Path $path -Include *LICENSE* -Recurse)
if ($LicenseFile){
Write-Host ' ** Binary files - ' $LicenseFile.Name ' file(s) found.' -ForeGround Green
} else {
Write-Warning " ** Binary files - LICENSE.txt file NOT found."
}
}
# Check for verification file when binaries are included
function Check-VerificationFile{
$VerificationFile=(Get-ChildItem -Path $path -Include *VERIFICATION* -Recurse)
if ($VerificationFile){
Write-Host ' ** Binary files - ' $VerificationFile.Name ' file(s) found.' -ForeGround Green
} else {
Write-Warning " ** Binary files - VERIFICATION.txt file NOT found."
}
}
# check for binaries
function Check-Binaries{
$IncludedBinaries=(Get-ChildItem -Path $path -Include $BinaryExtensions -Recurse)
if ($IncludedBinaries){
Write-Warning " ** Binary files found in package. This will trigger a message from the verifier:"
Write-Host " ** Note: Binary files (.exe, .msi, .zip) have been included. The reviewer will ensure the maintainers have`n distribution rights." -ForeGround Cyan
Check-LicenseFile
Check-VerificationFile
}
}
# add header template to <description>
function Add-Header{
if (Test-Path $CNCHeader){
$Header=(Get-Content $CNCHeader)
$NuspecDescription=$Header+$NuspecDescription
$UpdateNuspec=$True
return $NuspecDescription
} else {
Write-Warning " ** $CNCHeader not found."
}
}
# add footer template to <description>
function Add-Footer{
if (Test-Path $CNCFooter){
$Footer=(Get-Content $CNCFooter)
$NuspecDescription=$NuspecDescription+$Footer
$UpdateNuspec=$True
return $NuspecDescription
} else {
Write-Warning " ** $CNCFooter NOT found."
}
}
# check if header template is already in the description
function Check-Header{
$NuspecDescription=$NuspecDescription.Trim()
if ($NuspecDescription.StartsWith("***") -or $NuspecDescription.StartsWith("---") -or $NuspecDescription.StartsWith("___")){
Write-Host " ** <description> - standardized header found." -ForeGround Green
$HeaderFound=$True
}
}
# check if footer template is already in the description
function Check-Footer{
$NuspecDescription=$NuspecDescription.Trim()
if ($NuspecDescription.EndsWith("***") -or $NuspecDescription.EndsWith("---") -or $NuspecDescription.EndsWith("___")){
Write-Host " ** <description> - standardized footer found." -ForeGround Green
$FooterFound=$True
}
}
# Open all .nuspec URLs for viewing
function Open-URLs{
if ($NuspecBugTrackerURL){&start $NuspecBugTrackerURL}
if ($NuspecDocsURL){&start $NuspecDocsURL}
if ($NuspecIconURL){&start $NuspecIconURL}
if ($NuspecLicenseURL){&start $NuspecLicenseURL}
if ($NuspecMailingListURL){&start $NuspecMailingListURL}
if ($NuspecPackageSourceURL){&start $NuspecPackageSourceURL}
if ($NuspecProjectSourceURL){&start $NuspecProjectSourceURL}
if ($NuspecProjectURL){&start $NuspecProjectURL}
}
# Convert RawGit and non-CDN URLs to Staticaly (and maybe others in the future)
function Update-CDNURL([string]$oldURL){
if ($oldURL -match 'https://raw.githubusercontent.com'){$StaticalyURL=($oldURL -replace 'https://raw.githubusercontent.com','https://cdn.staticaly.com/gh')}
if ($oldURL -match 'https://cdn.rawgit.com'){$StaticalyURL=($oldURL -replace 'https://cdn.rawgit.com','https://cdn.staticaly.com/gh')}
$UpdateNuspec=$True
Write-Host " ** $oldURL" -ForeGround Yellow
Write-Host " converted to:" -Foreground Magenta
Write-Host " $StaticalyURL" -ForeGround Green
Write-Host " (saving not implemented yet)" -ForeGround Red
return $StaticalyURL
}
# FUTURE ENHANCEMENT load nuspec file and save changes
# Items that can be updated include description and iconUrl
Function Update-nuspec{
if ($UpdateNuspec){
Write-Host "Writing changes to $LocalnuspecFile." -ForeGround Magenta
[xml]$Updatednuspec = Get-Content $LocalnuspecFile
# Need to determine changes then write out file
$Updatednuspec.Save("$LocalnuspecFile")
}
}
# Import package.nuspec file to get values
# FUTURE ENHANCEMENT change to function
$nuspecXML = $LocalnuspecFile
[xml]$nuspecFile = Get-Content $nuspecXML
$NuspecAuthors = $nuspecFile.package.metadata.authors
$NuspecBugTrackerURL = $nuspecFile.package.metadata.bugtrackerurl
$NuspecConflicts = $nuspecFile.package.metadata.conflicts # Built for the future
$NuspecCopyright = $nuspecFile.package.metadata.copyright
$NuspecDependencies = $nuspecFile.package.metadata.dependencies
$NuspecDescription = $nuspecFile.package.metadata.description
$NuspecDocsURL = $nuspecFile.package.metadata.docsurl
$NuspecFiles = $nuspecFile.package.files.file
$NuspecIconURL = $nuspecFile.package.metadata.iconurl
$NuspecID = $nuspecFile.package.metadata.id
$NuspecLicenseURL = $nuspecFile.package.metadata.licenseurl
$NuspecMailingListURL = $nuspecFile.package.metadata.mailinglisturl
$NuspecOwners = $nuspecFile.package.metadata.owners
$NuspecPackageSourceURL = $nuspecFile.package.metadata.packagesourceurl
$NuspecProjectSourceURL = $nuspecFile.package.metadata.projectsourceurl
$NuspecProjectURL = $nuspecFile.package.metadata.projecturl
$NuspecProvides = $nuspecFile.package.metadata.provides # Built for the future
$NuspecReleaseNotes = $nuspecFile.package.metadata.releasenotes
$NuspecReplaces = $nuspecFile.package.metadata.replaces # Built for the future
$NuspecRequireLicenseAcceptance = $nuspecFile.package.metadata.requirelicenseacceptance
$NuspecSummary = $nuspecFile.package.metadata.summary
$NuspecTags = $nuspecFile.package.metadata.tags
$NuspecTitle = $nuspecFile.package.metadata.title
$NuspecVersion = $nuspecFile.package.metadata.version
$NuspecDisplayName=$LocalnuspecFile.Name
$NuspecDisplayName=$NuspecDisplayName.ToUpper()
# Start outputting check results
Write-Host "CNC Summary of $NuspecDisplayName :" -ForeGroundColor Magenta
# Open all .nuspec URLs for viewing if -OpenURLs is passed
if ($args -eq "-OpenURLs") {
Write-Host " ** Opening all .nuspec URLs in your default browser for viewing." -ForeGround Magenta
Open-URLs
}
# check for UTF8 encoding
$NuspecEncoding=(Get-FileEncoding -Path $LocalnuspecFile)
if ($NuspecEncoding -ne "UTF8"){Write-Warning " ** $NuspecDisplayName is $NuspecEncoding."}
# check XML declaration
if ($nuspecFile.xml -eq "version=""1.0"""){
Write-Warning " ** XML declaration is <?xml version=""1.0""?>"
Write-Host " ** Consider changing it to <?xml version=""1.0"" encoding=""utf-8""?>" -ForeGround Cyan
}
# check XML comment
if (!$nuspecFile.'#comment'){
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
Write-Warning " ** XML doesn't include the recommended UTF-8 checking comment"
Write-Host " ** Consider adding a UTF-8 checking comment such as:" -ForeGround Cyan
# Funny how this line requires UTF-8 w/BOM encoding to display correctly
Write-Host " <!-- Do not remove this test for UTF-8: if `“Ω`” doesn’t appear as greek uppercase omega letter enclosed in
quotation marks, you should use an editor that supports UTF-8, not this one. -->" -ForeGround Cyan
}
# <authors> checks
if (!($NuspecAuthors)) {
Write-Host " ** <authors> element is empty, this element is a requirement." -ForeGround Red
} else {
if ($NuspecAuthors -match "@"){
Write-Warning " ** <authors> - contains an e-mail address. This will trigger a message from the verifier:"
Write-Host ' ** Requirements: Email address should not be used in the Author and Copyright fields of the nuspec file. ' -ForeGround Cyan
}
}
# <bugTrackerUrl> checks
if (!($NuspecBugTrackerURL)) {
Write-Warning " ** <bugTrackerUrl> - element is empty. This will trigger a message from the verifier:"
Write-Host ' ** Suggestion: bugTrackerUrl - points to the location where issues and tickets can be accessed' -ForeGround Cyan
} else {
Validate-URL "<bugTrackerUrl>" $NuspecBugTrackerURL
}
# <conflicts> checks - Built for the future
#if (!($NuspecConflicts)) {Write-Warning " ** <conflicts> element is empty."}
# <copyright> checks
if (!($NuspecCopyright)) {
Write-Warning " ** <copyright> - element is empty."
} else {
if ($NuspecCopyright.Length -lt 5) {
Write-Warning " ** <copyright> - Please update the copyright field so that it is using at least 4 characters."
}
if ($NuspecAuthors -match "@"){
Write-Warning " ** <copyright> - contains an e-mail address. This will trigger a message from the verifier:"
Write-Host ' ** Requirements: Email address should not be used in the Author and Copyright fields of the nuspec file. ' -ForeGround Cyan
}
}
# <dependencies> checks
if (!($NuspecDependencies)) {
Write-Warning " ** <dependencies> - element is empty."
} else {
if ((!$NuspecDependencies) -and ($NuspecTitle -match "deprecated")){Write-Warning " ** <dependencies> - Deprecated packages must have a dependency."}
if ($NuspecDependencies.dependency.id -eq 'chocolatey'){
Write-Warning " ** <dependencies> - ""chocolatey"" is a dependency. This will trigger a message from the verifier:"
Write-Host " ** Note: The package takes a dependency on Chocolatey. The reviewer will ensure the package uses a specific`n Chocolatey feature that requires a minimum version." -ForeGround Cyan
}
$DependencyName=$NuspecDependencies.dependency.id
if ($NuspecDependencies.dependency.id.count -eq 1){
if ($NuspecDependencies.dependency.version -eq $null){
Write-Warning " ** <dependencies> - ""$DependencyName"" has no version. This will trigger a message from the verifier:"
Write-Host " ** Guideline: Package contains dependencies with no specified version. You should at least specify`n a minimum version of a dependency." -ForeGround Cyan
}
} else {
$DependencyNumber=0
do{
$DependencyName=$NuspecDependencies.dependency.id[$DependencyNumber]
if ($NuspecDependencies.dependency[$DependencyNumber].version -eq $null){
Write-Warning " ** <dependencies> - ""$DependencyName"" has no version. This will trigger a message from the verifier:"
Write-Host " ** Guideline: Package contains dependencies with no specified version. You should at least specify`n a minimum version of a dependency." -ForeGround Cyan
}
$DependencyNumber++
} while ($DependencyNumber -lt $NuspecDependencies.dependency.id.count)
}
}
# <description> checks
if (!($NuspecDescription)) {
Write-Host " ** <description> - element is empty, this element is a requirement." -ForeGround Red
} else {
Check-Header
Check-Footer
if ($NuspecDescription.Length -lt 30) {Write-Warning " ** <description> - is less than 30 characters."}
if ($NuspecDescription.Length -gt 4000) {Write-Warning " ** <description> - is greater than 4,000 characters."}
if ($NuspecDescription -match "raw.githubusercontent"){
Write-Warning " ** <description> - has a GitHub direct link. Please change to a CDN such as:"
Write-Host " ** $CDNlist" -ForeGround Cyan
# Update-CDNURL - (need to parse and pass URL)
}
if ($NuspecDescription -match "cdn.rawgit.com"){
Write-Warning " ** <description> - RawGit CDN will be going offline October 2019. Please change to a CDN such as:"
Write-Host " ** $CDNlist" -ForeGround Cyan
# Update-CDNURL - (need to parse and pass URL)
}
}
# <docsUrl> checks
if (!($NuspecDocsURL)) {
Write-Warning " ** <docsUrl> - element is empty. This will trigger a message from the verifier:"
Write-Host ' ** Suggestion: docsUrl - points to the location of the wiki or docs of the software' -ForeGround Cyan
} else {
Validate-URL "<docsUrl>" $NuspecDocsURL
}
# <files> checks
if (!($NuspecFiles)) {
Write-Warning " ** <files> - element is empty. All of the following files will be packaged:"
Get-ChildItem -Path $path -Exclude *.nupkg | Write-Host -ForeGround Cyan
}
# <iconUrl> checks
if (!($NuspecIconURL)) {
Write-Warning " ** <iconUrl> - element is empty. This will trigger a message from the verifier:"
Write-Host ' ** Guideline: The iconUrl should be added if there is one. Please correct this in the nuspec, if applicable.' -ForeGround Cyan
} else {
Validate-URL "<iconUrl>" $NuspecIconURL
$IconExt=($NuspecIconURL | Select-String -Pattern $AcceptableIconExts)
if (!($IconExt)){
Write-Warning " ** <iconUrl> - Your package icon is NOT a .PNG or .SVG. This will trigger a message from the verifier:"
Write-Host ' ** Suggestion: As per the packaging guidelines icons should be either a png or svg file.' -ForeGround Cyan
}
if ($NuspecIconURL -match "raw.githubusercontent"){
if ($args -eq "-UpdateImageURLs") {
$NewNuspecIconURL=(Update-CDNURL "$NuspecIconURL")
} else {
Write-Warning " ** <iconUrl> - Your package icon links directly to GitHub. Please use a CDN such as:"
Write-Host " ** $CDNlist" -ForeGround Cyan
}
}
if ($NuspecIconURL -match "cdn.rawgit.com"){
if ($args -eq "-UpdateImageURLs") {
$NewNuspecIconURL=(Update-CDNURL "$NuspecIconURL")
} else {
Write-Warning " ** <iconUrl> - RawGit CDN will be going offline October 2019. Please change to a CDN such as:"
Write-Host " ** $CDNlist" -ForeGround Cyan
}
}
}
# <id> checks
if (!($NuspecID)) {
Write-Host " ** <id> - element is empty, this element is a requirement." -ForeGround Red
} else {
if (($NuspecID.Length -gt 20) -and (!$NuspecID.Contains("-")) -and (!$NuspecID.Contains("."))) {
Write-Warning " ** <id> - is greater than 20 characters. This will trigger a message from the verifier:"
Write-Host " ** Note: If this is a new package that has never been approved, moderators will review and reject the`n package for one that will be pushed with a new id that meets the package naming guidelines." -ForeGround Cyan
}
if ($NuspecID -cmatch "[A-Z]") {Write-Warning " ** <id> - includes UPPERcase letters." }
if (($NuspecID.Contains(".")) -and (!$NuspecID.Contains(".install")) -and (!$NuspecID.Contains(".portable")) -and (!$NuspecID.Contains(".extension"))) {
Write-Warning " ** <id> - includes a '.'. This will trigger a message from the verifier:"
Write-Host " ** Note: If this is a new package that has never been approved, moderators will review and reject the package`n for one that will be pushed with a new id that meets the package naming guidelines." -ForeGround Cyan
}
}
# <licenseUrl> checks
if (!($NuspecLicenseURL)) {
Write-Warning " ** <licenseUrl> - element is empty. This will trigger a message from the verifier:"
Write-Host " ** Guideline: The licenseUrl should be added if there is one. Please correct this in the nuspec,`n if applicable." -ForeGround Cyan
} else {
Validate-URL "<licenseUrl>" $NuspecLicenseURL
}
# <mailingListUrl> checks
if (!($NuspecMailingListURL)) {
Write-Warning " ** <mailingListUrl> - element is empty. This will trigger a message from the verifier:"
Write-Host ' ** Suggestion: mailingListUrl - points to the forum or email list group for the software' -ForeGround Cyan
} else {
Validate-URL "<mailingListUrl>" $NuspecMailingListURL
}
# <owners> checks
if (!($NuspecOwners)) {
Write-Warning " ** <owners> element is empty."
} else {
if ($NuspecAuthors -eq $NuspecOwners){
Write-Warning " ** <owners> and <authors> elements are the same. This will trigger a message from the verifier:"
Write-Host " ** Note: The package maintainer field (owners) matches the software author field (authors) in the nuspec.`n The reviewer will ensure that the package maintainer is also the software author." -ForeGround Cyan
}
}
# <packageSourceUrl> checks
if (!($NuspecPackageSourceURL)) {
Write-Warning " ** <packageSourceUrl> - element is empty. This will trigger a message from the verifier:"
Write-Host " ** Guideline: The nuspec has been enhanced to allow packageSourceUrl, pointing to the url where the package`n source resides. This is a strong guideline because it simplifies collaboration.`n Please add it to the nuspec." -ForeGround Cyan
} else {
Validate-URL "<packageSourceUrl>" $NuspecPackageSourceURL
}
# <projectSourceUrl> checks
if (!($NuspecProjectSourceURL)) {
Write-Warning " ** <projectSourceUrl> - element is empty. This will trigger a message from the verifier:"
Write-Host ' ** Suggestion: projectSourceUrl - points to the location of the underlying software source' -ForeGround Cyan
} else {
Validate-URL "<projectSourceUrl>" $NuspecProjectSourceURL
if ($NuspecProjectURL -eq $NuspecProjectSourceURL){
Write-Warning " ** <projectUrl> and <projectSourceUrl> elements are the same. This will trigger a message from the verifier:"
Write-Host " ** Guideline: ProjectUrl and ProjectSourceUrl are typically different, but not always. Please ensure`n that projectSourceUrl is pointing to software source code or remove the field from the nuspec." -ForeGround Cyan
}
}
# <projectUrl> checks
if (!($NuspecProjectURL)) {
Write-Warning " ** <projectUrl> - element is empty."
} else {
Validate-URL "<projectUrl>" $NuspecProjectURL
}
# <provides> checks - Built for the future
#if (!($NuspecProvides)) {Write-Warning " ** <provides> element is empty"}
# <releaseNotes> checks
if (!($NuspecReleaseNotes)) {
Write-Warning " ** <releaseNotes> element is empty. This will trigger a message from the verifier:"
Write-Host " ** Guideline: Release Notes (releaseNotes) are a short description of changes in each version of a package.`n Please include releasenotes in the nuspec. NOTE: To prevent the need to continually update this field,`n providing a URL to an external list of Release Notes is perfectly acceptable." -ForeGround Cyan
}
# <replaces> checks - Built for the future
#if (!($NuspecReplaces)) {Write-Warning " ** <replaces> element is empty."}
# <requireLicenseAcceptance> checks
if (!($NuspecRequireLicenseAcceptance)) {
Write-Warning " ** <requireLicenseAcceptance> - element is empty."
} else {
if (($NuspecRequireLicenseAcceptance -eq "true") -and (!($NuspecLicenseURL))) {
Write-Warning " ** <requireLicenseAcceptance> is set to true but <licenseUrl> is empty."
}
}
# <summary> checks
if (!($NuspecSummary)) {
Write-Warning " ** <summary> - element is empty. This will trigger a message from the verifier:"
Write-Host ' ** Guideline: • Summary (summary) is a short explanation of the software. Please include summary in the nuspec.' -ForeGround Cyan
}
# <tags> checks
if (!($NuspecTags)) {
Write-Warning " ** <tags> - element is empty."
} else {
if ($NuspecTags -match ","){
Write-Warning " ** <tags> - tags are separated with commas. They should only be separated with spaces."
}
if ($NuspecTags -match "chocolatey"){
Write-Warning " ** Note: There is a tag named ""chocolatey"" which will trigger a message from the verifier:"
Write-Host ' ** Tags (tags) should not contain 'chocolatey' as a tag. Please remove that in the nuspec.' -ForeGround Cyan
}
if ($NuspecTags -match "notsilent"){
Write-Warning " ** Note: There is a tag named ""notsilent"" which will trigger a message from the verifier:"
Write-Host ' ** Note: notSilent tag is being used. The reviewer will ensure this is being used appropriately. ' -ForeGround Cyan
}
}
# <title> checks
if (!($NuspecTitle)) {Write-Warning " ** <title> - element is empty."}
# <version> checks
if (!($NuspecVersion)) {Write-Host " ** <version> - element is empty, this element is a requirement." -ForeGround Red}
# Binaries checks
Check-Binaries
# add header template to <description> if -AddHeader is passed to script
if ($args -eq "-AddHeader") {
$NewNuspecDescription=(Add-Header)
}
# add footer template to <description> if -AddFooter is passed to script
if ($args -eq "-AddFooter") {
$NewNuspecDescription=(Add-Footer)
}
Write-Host $NewNuspecDescription -ForeGround Green # temporary debugging
# FUTURE ENHANCEMENT update changes to nuspec
# Update-nuspec{
# $NewNuspecIconURL - make global ?
# $NewNuspecDescription - make global ?
#}
Write-Host "Found CNC.ps1 useful?" -ForeGroundColor white
Write-Host "Buy me a beer at https://www.paypal.me/bcurran3donations" -ForeGroundColor white
Write-Host "Become a patron at https://www.patreon.com/bcurran3" -ForeGroundColor white
return
# TDL
# add the saving of changes to the nuspec
# "Nuspec file contains templated values which should be removed."
# option of displaying useful tips and tweaks (AutoHotKey, BeCyIconGrabber, PngOptimizer, Regshot, service viewer program, Sumo, etc)
# check http links to see if https links are available and report if so - low priority
# MAYBE download icon file and check it's dimension - very low priority
# What else?
___
___
Log in or click on link to see number of positives.
In cases where actual malware is found, the packages are subject to removal. Software sometimes has false positives. Moderators do not necessarily validate the safety of the underlying software, only that a package retrieves software from the official distribution point and/or validate embedded software against official distribution point (where distribution rights allow redistribution).
Chocolatey Pro provides runtime protection from possible malware.
Copyleft Bill Curran
CHANGELOG:
- 2019.01.22 - added xml declaration and UTF-8 comment checking, better dependency version checking, a rare verifier message I missed
- 2019.01.15 - you can now specify a path to a directory containing a .nuspec file to check, misc minor tweaks
- 2019.01.13 - finished the dependencies checking, all verifier messages (guidelines, suggestions, and notes) now reporting in CNC
- 2019.01.12 - minor fixes
- 2019.01.09 - many more checks and warnings added, almost all known verifier guidelines, suggestions and notes added, some beautifications, added option to view Chocolatey validator info page, added optional image GitHub direct and RawGit URL conversions to Staticaly CDN URLs
- 2019.01.07 - added help, added option to open and view all URLs in your default browser, added options to view, edit, and add "standard" (template) headers and footers to the description (can't save yet), added reporting of standard header and footer if found, added more verifier messages, added checking for descriptions that are too large (>4,000), now checks for license files other than LICENSE.txt, probably more I don't remember :)
- 2019.01.04 - implemented included binary files checking and messages, laid out the groundwork for the future enhancements
- 2019.01.03 - fixed some URL checking handling that could cause PS errors, updated list of CDN recommendations, added checking for RawGit URLs in description, cosmetic updates
- 2018.12.22-2018-12.28 - initial release
ROADMAP:
- save desired changes to the .nuspec file
- capture and test URLs found in description
- add packaging tips/tweaks/etc
This package has no dependencies.
Ground Rules:
- This discussion is only about (unofficial) Chocolatey .nuspec Checker (Script) and the (unofficial) Chocolatey .nuspec Checker (Script) package. If you have feedback for Chocolatey, please contact the Google Group.
- This discussion will carry over multiple versions. If you have a comment about a particular version, please note that in your comments.
- The maintainers of this Chocolatey Package will be notified about new comments that are posted to this Disqus thread, however, it is NOT a guarantee that you will get a response. If you do not hear back from the maintainers after posting a message below, please follow up by using the link on the left side of this page or follow this link to contact maintainers. If you still hear nothing back, please follow the package triage process.
- Tell us what you love about the package or (unofficial) Chocolatey .nuspec Checker (Script), or tell us what needs improvement.
- Share your experiences with the package, or extra configuration or gotchas that you've found.
- If you use a url, the comment will be flagged for moderation until you've been whitelisted. Disqus moderated comments are approved on a weekly schedule if not sooner. It could take between 1-5 days for your comment to show up.