Freshly installed _Ubuntu 17.04_ installs http://liw.fi/cmdtest/ instead of _yarnpkg/yarn_
vit@vit-u17:~$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
[sudo] password for vit:
OK
vit@vit-u17:~$ sudo apt-get update && sudo apt-get install yarn
Get:1 http://security.ubuntu.com/ubuntu zesty-security InRelease [89,2 kB]
Get:2 http://security.ubuntu.com/ubuntu zesty-security/main amd64 DEP-11 Metadata [204 B]
Ign:3 http://dl.google.com/linux/chrome/deb stable InRelease
Get:4 http://dl.google.com/linux/chrome/deb stable Release [1.189 B]
Get:5 http://dl.google.com/linux/chrome/deb stable Release.gpg [916 B]
Get:6 http://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1.459 B]
Hit:7 http://by.archive.ubuntu.com/ubuntu zesty InRelease
Get:8 http://by.archive.ubuntu.com/ubuntu zesty-updates InRelease [89,2 kB]
Hit:9 http://by.archive.ubuntu.com/ubuntu zesty-backports InRelease
Get:10 http://by.archive.ubuntu.com/ubuntu zesty-updates/main amd64 DEP-11 Metadata [208 B]
Fetched 182 kB in 5s (32,9 kB/s)
Reading package lists... Done
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'cmdtest' instead of 'yarn'
The following additional packages will be installed:
python-chardet python-cliapp python-markdown python-pkg-resources
python-pygments python-ttystatus python-yaml
Suggested packages:
libjs-jquery libjs-underscore python-xdg python-markdown-doc
python-setuptools ttf-bitstream-vera
The following NEW packages will be installed:
cmdtest python-chardet python-cliapp python-markdown python-pkg-resources
python-pygments python-ttystatus python-yaml
0 upgraded, 8 newly installed, 0 to remove and 0 not upgraded.
Need to get 1.080 kB of archives.
After this operation, 5.609 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://by.archive.ubuntu.com/ubuntu zesty/main amd64 python-yaml amd64 3.12-1 [115 kB]
Get:2 http://by.archive.ubuntu.com/ubuntu zesty/universe amd64 python-cliapp all 1.20160724-2 [76,8 kB]
Get:3 http://by.archive.ubuntu.com/ubuntu zesty/universe amd64 python-ttystatus all 0.34-1 [13,7 kB]
Get:4 http://by.archive.ubuntu.com/ubuntu zesty/universe amd64 python-markdown all 2.6.8-1 [55,2 kB]
Get:5 http://by.archive.ubuntu.com/ubuntu zesty/universe amd64 cmdtest all 0.27-1 [19,4 kB]
Get:6 http://by.archive.ubuntu.com/ubuntu zesty/main amd64 python-pkg-resources all 33.1.1-1 [127 kB]
Get:7 http://by.archive.ubuntu.com/ubuntu zesty/main amd64 python-chardet all 2.3.0-2 [96,3 kB]
Get:8 http://by.archive.ubuntu.com/ubuntu zesty/main amd64 python-pygments all 2.2.0+dfsg-1 [577 kB]
Fetched 1.080 kB in 3s (325 kB/s)
Selecting previously unselected package python-yaml.
(Reading database ... 169947 files and directories currently installed.)
Preparing to unpack .../0-python-yaml_3.12-1_amd64.deb ...
Unpacking python-yaml (3.12-1) ...
Selecting previously unselected package python-cliapp.
Preparing to unpack .../1-python-cliapp_1.20160724-2_all.deb ...
Unpacking python-cliapp (1.20160724-2) ...
Selecting previously unselected package python-ttystatus.
Preparing to unpack .../2-python-ttystatus_0.34-1_all.deb ...
Unpacking python-ttystatus (0.34-1) ...
Selecting previously unselected package python-markdown.
Preparing to unpack .../3-python-markdown_2.6.8-1_all.deb ...
Unpacking python-markdown (2.6.8-1) ...
Selecting previously unselected package cmdtest.
Preparing to unpack .../4-cmdtest_0.27-1_all.deb ...
Unpacking cmdtest (0.27-1) ...
Selecting previously unselected package python-pkg-resources.
Preparing to unpack .../5-python-pkg-resources_33.1.1-1_all.deb ...
Unpacking python-pkg-resources (33.1.1-1) ...
Selecting previously unselected package python-chardet.
Preparing to unpack .../6-python-chardet_2.3.0-2_all.deb ...
Unpacking python-chardet (2.3.0-2) ...
Selecting previously unselected package python-pygments.
Preparing to unpack .../7-python-pygments_2.2.0+dfsg-1_all.deb ...
Unpacking python-pygments (2.2.0+dfsg-1) ...
Setting up python-yaml (3.12-1) ...
Setting up python-ttystatus (0.34-1) ...
Setting up python-cliapp (1.20160724-2) ...
Setting up python-pkg-resources (33.1.1-1) ...
Setting up python-pygments (2.2.0+dfsg-1) ...
Processing triggers for man-db (2.7.6.1-2) ...
Setting up python-markdown (2.6.8-1) ...
Setting up python-chardet (2.3.0-2) ...
Setting up cmdtest (0.27-1) ...
vit@vit-u17:~$ yarn --version
0.27
vit@vit-u17:~$ which yarn
/usr/bin/yarn
vit@vit-u17:~$ cat /usr/bin/yarn
#! /usr/bin/python
# Copyright 2013 Lars Wirzenius
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-3+ =*=
import cliapp
import collections
import locale
import logging
import os
import re
import shutil
import sys
import tempfile
import time
import ttystatus
import yarnlib
class YarnRunner(cliapp.Application):
def add_settings(self):
self.settings.boolean(
['no-act', 'dry-run', 'pretend', 'n'],
'do not actually run any tests, merely print what would be run')
self.settings.boolean(
['quiet', 'q'],
'be quiet, avoid progress reporting, only show errors')
self.settings.boolean(
['verbose', 'v'],
'make progress reporting be more verbose ("wall of text"), '
'instead of a one-line status info; this is turned '
'automatically if there is not terminal')
self.settings.string_list(
['shell-library', 's'],
'include a shell library for the IMPLEMENTS sections to use')
self.settings.string_list(
['run', 'r'],
'run only SCENARIO (this option can be repeated)',
metavar='SCENARIO')
self.settings.string(
['tempdir'],
'use DIR as the temporary directory for tests; '
'it should be empty or not exist',
metavar='DIR')
self.settings.string_list(
['env'],
'add NAME=VALUE to the environment when tests are run',
metavar='NAME=VALUE')
self.settings.boolean(
['snapshot'],
'make snapshots of test working directory '
'after each scenario step; you probably '
'want to use this with --tempdir')
self.settings.boolean(
['timings'],
'report wall clock time for each scenario and step')
self.settings.boolean(
['allow-missing-steps'],
'allow scenarios to reference steps that do not exist, '
'by warning about them, but otherwise ignoring the scenarios')
self.settings.boolean(
['require-assumptions'],
'require ASSUMING to always pass')
self.settings.string(
['shell'],
'run IMPLEMENTS using SHELL',
metavar='SHELL',
default='/bin/sh')
self.settings.string_list(
['shell-arg'],
'use ARG when running shell',
metavar='ARG',
default=['-xeu'])
self.settings.boolean(
['cd-datadir'],
'change to DATADIR when running commands',
default=False)
self.settings.boolean(
['stop-on-first-fail'],
"stop if any scenario step fails, don't run more scenarios")
def stdout(self, msg):
self._write(sys.stdout, msg)
def stderr(self, msg):
self._write(sys.stderr, msg)
def _write(self, output, msg):
if isinstance(msg, unicode):
msg = msg.encode(locale.getpreferredencoding())
output.write(msg)
output.flush()
def info(self, indent, msg):
if self.settings['verbose']:
logging.info(msg)
indent_size = 4
self.stdout('%*s%s\n' % (indent * indent_size, '', msg))
def warning(self, msg):
if self.settings['verbose']:
logging.warning(msg)
self.stdout('WARNING: %s\n' % msg)
elif not self.settings['quiet']:
self.ts.notify('WARNING: %s' % msg)
def error(self, msg):
if self.settings['verbose']:
logging.info(msg)
self.stderr('%s\n' % msg)
elif not self.settings['quiet']:
self.ts.error(msg)
def process_args(self, args):
# Do we have tty? If not, turn on --verbose, unless --quiet.
if not self.settings['quiet']:
try:
open('/dev/tty', 'w')
except IOError:
self.settings['verbose'] = True
self.ts = ttystatus.TerminalStatus(period=0.001)
if not self.settings['quiet'] and not self.settings['verbose']:
self.ts.format(
'%ElapsedTime() %Index(current_step,all_steps): '
'%String(scenario_name): '
'%String(step_name)')
scenarios, implementations = self.parse_scenarios(args)
self.check_there_are_scenarios(scenarios)
self.check_for_duplicate_scenario_names(scenarios)
self.check_for_thens(scenarios)
scenarios = self.connect_implementations(scenarios, implementations)
shell_prelude = self.load_shell_libraries()
self.info(0, 'Found %d scenarios' % len(scenarios))
all_steps = []
for scenario in scenarios:
all_steps.extend(scenario.steps)
self.ts['all_steps'] = all_steps
self.scenarios_run = 0
self.skipped_for_assuming = 0
self.steps_run = 0
self.timings = []
start_time = time.time()
failed_scenarios = []
for scenario in self.select_scenarios(scenarios):
if not self.run_scenario(scenario, shell_prelude):
failed_scenarios.append(scenario)
if self.settings['stop-on-first-fail']:
break
duration = time.time() - start_time
if not self.settings['quiet']:
self.ts.clear()
self.ts.finish()
if failed_scenarios:
self.stderr('Failed scenarios:\n')
for scenario in failed_scenarios:
self.stderr(' - %s\n' % scenario.name)
raise cliapp.AppException(
'Test suite FAILED in %s scenarios' % len(failed_scenarios))
if not self.settings['quiet']:
self.stdout(
'Scenario test suite PASS, with %d scenarios '
'(%d total steps), '
'in %.1f seconds\n' %
(self.scenarios_run, self.steps_run, duration))
if self.skipped_for_assuming:
self.stdout(
'Scenarios SKIPPED due to ASSUMING step failing: %d\n'
% self.skipped_for_assuming)
if self.settings['timings']:
self.report_timings()
def parse_scenarios(self, filenames):
mdparser = yarnlib.MarkdownParser()
for filename in filenames:
self.info(0, 'Parsing scenario file %s' % filename)
blocks = mdparser.parse_file(filename)
block_parser = yarnlib.BlockParser()
block_parser.parse_blocks(mdparser.blocks)
return block_parser.scenarios, block_parser.implementations
def check_there_are_scenarios(self, scenarios):
if not scenarios:
raise cliapp.AppException(
'There are no scenarios; must have at least one.')
def check_for_duplicate_scenario_names(self, scenarios):
counts = collections.Counter()
for s in scenarios:
counts[s.name] += 1
duplicates = [name for name in counts if counts[name] > 1]
if duplicates:
duplist = ''.join(' %s\n' % name for name in duplicates)
raise cliapp.AppException(
'There are scenarios with duplicate names:\n%s' % duplist)
def check_for_thens(self, scenarios):
no_thens = []
for scenario in scenarios:
for step in scenario.steps:
if step.what == 'THEN':
break
else:
no_thens.append(scenario)
if no_thens:
raise cliapp.AppException(
'Some scenarios have no THENs:\n%s' %
''.join(' "%s"\n' % s.name for s in no_thens))
def connect_implementations(self, scenarios, implementations):
new_list = []
for scenario in scenarios:
missing_step = False
for step in scenario.steps:
self.connect_implementation(
scenario, step, implementations)
if step.implementation is None:
missing_step = True
if not missing_step:
new_list.append(scenario)
return new_list
def connect_implementation(self, scenario, step, implementations):
matching = [i for i in implementations
if step.what == i.what and
self.implements_matches_step(i, step)]
if len(matching) == 0:
if self.settings['allow-missing-steps']:
self.warning(
'Scenario %s has missing step %s %s' %
(scenario.name, step.what, step.text))
return
raise cliapp.AppException(
'Scenario "%s", step "%s %s" has no matching '
'implementation' %
(scenario.name, step.what, step.text))
if len(matching) > 1:
s = '\n'.join(
'IMPLEMENTS %s %s' % (i.what, i.regexp)
for i in matching)
raise cliapp.AppException(
'Scenario "%s", step "%s %s" has more than one '
'matching implementations:\n%s' %
(scenario.name, step.what, step.text, s))
assert step.implementation is None
step.implementation = matching[0]
def load_shell_libraries(self):
if not self.settings['shell-library']:
self.info(0, 'No shell libraries defined')
return ''
libs = []
for filename in self.settings['shell-library']:
self.info(0, 'Loading shell library %s' % filename)
with open(filename) as f:
text = f.read()
libs.append('# Loaded from %s\n\n%s\n\n' % (filename, text))
return ''.join(libs)
def select_scenarios(self, scenarios):
def normalise(s):
return ' '.join(s.lower().split())
def matches(a, b):
return normalise(a) == normalise(b)
if self.settings['run']:
result = []
for name in self.settings['run']:
for s in scenarios:
if matches(s.name, name) and s not in result:
result.append(s)
break
else:
raise cliapp.AppException(
'Requested scenario %s does not exist' %
name)
return result
return scenarios
def run_scenario(self, scenario, shell_prelude):
self.start_scenario_timing(scenario.name)
started = time.time()
self.info(0, 'Running scenario %s' % scenario.name)
self.ts['scenario_name'] = scenario.name.encode('utf-8')
self.ts.flush()
self.scenarios_run += 1
if self.settings['no-act']:
self.info(0, 'Pretending everything went OK')
for step in scenario.steps:
self.ts['current_step'] = step
self.ts.flush()
self.remember_scenario_timing(time.time() - started)
return True
if self.settings['tempdir']:
tempdir = os.path.abspath(self.settings['tempdir'])
if not os.path.exists(tempdir):
os.mkdir(tempdir)
else:
tempdir = tempfile.mkdtemp()
os.mkdir(self.scenario_dir(tempdir, scenario))
datadir = self.datadir(tempdir, scenario)
os.mkdir(datadir)
self.info(1, 'DATADIR is %s' % datadir)
homedir = self.homedir(datadir)
os.mkdir(homedir)
self.info(1, 'HOME for tests is %s' % homedir)
assuming = [s for s in scenario.steps if s.what == 'ASSUMING']
cleanup = [s for s in scenario.steps if s.what == 'FINALLY']
normal = [s for s in scenario.steps if s not in assuming + cleanup]
ok = True
step_number = 0
for step in assuming:
exit = self.run_step(datadir, scenario, step, shell_prelude, False)
step_number += 1
self.snapshot_datadir(
tempdir, datadir, scenario, step_number, step)
if self.settings['require-assumptions'] and exit != 0:
ok = False
break
elif exit != 0:
self.ts.notify(
'Skipping "%s" because "%s %s" failed' %
(scenario.name, step.what, step.text))
self.skipped_for_assuming += 1
break
else:
for step in normal:
exit = self.run_step(
datadir, scenario, step, shell_prelude, True)
step_number += 1
self.snapshot_datadir(
tempdir, datadir, scenario, step_number, step)
if exit != 0:
ok = False
break
for step in cleanup:
exit = self.run_step(
datadir, scenario, step, shell_prelude, True)
step_number += 1
self.snapshot_datadir(
tempdir, datadir, scenario, step_number, step)
if exit != 0:
ok = False
break
if not self.settings['snapshot']:
shutil.rmtree(tempdir, ignore_errors=True)
self.remember_scenario_timing(time.time() - started)
return ok
def homedir(self, datadir):
return os.path.join(datadir, 'HOME')
def clean_env(self):
'''Return a clean environment for running tests.'''
whitelisted = [
'PATH',
]
hardcoded = {
'TERM': 'dumb',
'SHELL': '/bin/sh',
'LC_ALL': 'C',
'USER': 'tomjon',
'USERNAME': 'tomjon',
'LOGNAME': 'tomjon',
}
env = {}
for key in whitelisted:
if key in os.environ:
env[key] = os.environ[key]
for key in hardcoded:
env[key] = hardcoded[key]
for option_arg in self.settings['env']:
if '=' not in option_arg:
raise cliapp.AppException(
'--env argument must contain "=" '
'to separate environment variable name and value')
key, value = option_arg.split('=', 1)
env[key] = value
return env
def run_step(self, datadir, scenario, step, shell_prelude, report_error):
started = time.time()
self.info(1, 'Running step "%s %s"' % (step.what, step.text))
self.ts['current_step'] = step
self.ts['step_name'] = '%s %s' % (step.what, step.text.encode('utf8'))
self.ts.flush()
self.steps_run += 1
m = self.implements_matches_step(step.implementation, step)
assert m is not None
env = self.clean_env()
env['DATADIR'] = datadir
env['SRCDIR'] = os.getcwd()
env['HOME'] = self.homedir(datadir)
for i, match in enumerate(m.groups('')):
env['MATCH_%d' % (i+1)] = match.encode('utf-8')
self.add_srcdir_to_pythonpath(env, env['SRCDIR'])
if self.settings['cd-datadir']:
cwd = datadir
else:
cwd = '.'
fd, shell_script = tempfile.mkstemp()
os.close(fd)
with open(shell_script, 'w') as f:
f.write(shell_prelude)
f.write(step.implementation.shell)
f.flush()
shell = self.settings['shell']
shell_args = [x for x in self.settings['shell-arg'] if x]
logging.debug('shell: %r', shell)
logging.debug('shell_args: %r', shell_args)
logging.debug('shell_script: %r', shell_script)
exit, stdout, stderr = cliapp.runcmd_unchecked(
[shell] + shell_args + [shell_script],
env=env, cwd=cwd)
os.remove(shell_script)
logging.debug('Exit code: %d' % exit)
if stdout:
logging.debug('Standard output:\n%s' % self.indent(stdout))
else:
logging.debug('Standard output: empty')
if stderr:
logging.debug('Standard error:\n%s' % self.indent(stderr))
else:
logging.debug('Standard error: empty')
if exit != 0 and report_error:
self.error('ERROR: In scenario "%s"' % scenario.name)
self.error('step "%s %s" failed,' % (step.what, step.text))
self.error('with exit code %d:' % exit)
self.error('Standard output from shell command:\n%s' %
self.indent(stdout))
self.error('Standard error from shell command:\n%s' %
self.indent(stderr))
self.remember_step_timing(
'%s %s' % (step.what, step.text), time.time() - started)
return exit
def add_srcdir_to_pythonpath(self, env, srcdir):
# Special handling of PYTHONPATH. Add $SRCDIR to it so that
# Python IMPLEMENTS can use it. But only if --shell=python is
# used. This is a bit of magic that hopefully won't surprise
# users too much.
if self.settings['shell'] == 'python':
pythonpath = env.get('PYTHONPATH', None)
if pythonpath:
pythonpath += ':' + srcdir
else:
pythonpath = srcdir
env['PYTHONPATH'] = pythonpath
def scenario_dir(self, tempdir, scenario):
return os.path.join(tempdir, self.nice(scenario.name))
def datadir(self, tempdir, scenario):
sd = self.scenario_dir(tempdir, scenario)
return os.path.join(sd, 'datadir')
def snapshot_dir(self, tempdir, scenario, step, step_number):
sd = self.scenario_dir(tempdir, scenario)
base = '%03d-%s-%s' % (step_number, step.what, self.nice(step.text))
return os.path.join(sd, base)
def snapshot_datadir(self, tempdir, datadir, scenario, step_number, step):
if self.settings['snapshot']:
snapshot = self.snapshot_dir(tempdir, scenario, step, step_number)
exit, out, err = cliapp.runcmd_unchecked(
['cp', '-ax', datadir, snapshot])
if exit != 0:
logging.warning('Snapshot copy failed:\n%s\n%s' % (out, err))
def nice(self, name):
# Quote a scenario or step name so it forms a nice filename.
nice_chars = "abcdefghijklmnopqrstuvwxyz"
nice_chars += nice_chars.upper()
nice_chars += "0123456789-."
nice = []
for c in name:
if c in nice_chars:
nice.append(c)
elif not nice or nice[-1] != '_':
nice.append('_')
nice = ''.join(nice)
return nice
def implements_matches_step(self, implements, step):
'''Return re.Match if implements matches the step.
Otherwise, return None.
'''
m = re.match(implements.regexp, step.text, re.I)
if m and m.end() != len(step.text):
return None
return m
def indent(self, s):
return ''.join(' %s\n' % line for line in s.splitlines())
def start_scenario_timing(self, scenario_name):
self.timings.append((scenario_name, None, []))
def remember_scenario_timing(self, duration):
scenario_name, _, step_tuples = self.timings[-1]
self.timings[-1] = (scenario_name, duration, step_tuples)
def remember_step_timing(self, step_name, step_duration):
scenario_name, scenario_duration, step_tuples = self.timings[-1]
step_tuples = step_tuples + [(step_name, step_duration)]
self.timings[-1] = (scenario_name, scenario_duration, step_tuples)
def report_timings(self):
for scenario_name, scenario_duration, step_tuples in self.timings:
self.stdout('%5.1f %s' % (scenario_duration, scenario_name))
for step_name, step_duration in step_tuples:
self.stdout(' %5.1f %s' % (step_duration, step_name))
YarnRunner(version=yarnlib.__version__).run()
That was actually my fault. I didn't add package repository properly.
I just ran into the same problem. For some reason, echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
didn't get pasted correctly. Also needed to sudo apt-get remove cmdtest
to get it working.
Also note that after adding the yarn package, you need to sudo apt update
before attempting to install it again.
@pekeler and @dsblank thanks for the help here!
@vitalymak this is an abomination. I ran into the same issue and this resolved it:
sudo apt-get remove cmdinstall;sudo apt update;sudo apt-get install yarn
Thanks @jasonwr for the tip, I was getting issues in Ubuntu 17.04
, now its working like a charm :slightly_smiling_face:
Did you run the following:
sudo apt-get remove cmdinstall;sudo apt update;sudo apt-get install yarn
On Wed, Jan 3, 2018 at 2:27 AM, Jens Madsen notifications@github.com
wrote:
on ubuntu 17.10 I get
sudo apt-get install yarn
[sudo] password for yolen:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'cmdtest' instead of 'yarn'
The following NEW packages will be installed:
cmdtest
0 upgraded, 1 newly installed, 0 to remove and 5 not upgraded.
Need to get 0 B/19.4 kB of archives.
After this operation, 80.9 kB of additional disk space will be used.
Selecting previously unselected package cmdtest.
(Reading database ... 319524 files and directories currently installed.)
Preparing to unpack .../cmdtest_0.27-1_all.deb ...
Unpacking cmdtest (0.27-1) ...
Setting up cmdtest (0.27-1) ...
Processing triggers for man-db (2.7.6.1-2) ...None of the tips work for me
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/yarnpkg/yarn/issues/3189#issuecomment-354968232, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AASrT1zYc9Chbn-eVK-h5cErqlVLFZC0ks5tG0gbgaJpZM4NBldb
.
--
Jason W. Rice
LinkedIn:http://www.linkedin.com/pub/jason-rice/16/10/131/
Email:[email protected]
@jasonwr I am running Gnome17.10 and getting _cmdtest_ installed instead of _yarn_ after doing sudo apt-get remove cmdinstall;sudo apt update;sudo apt-get install yarn
.
This is what I get on the terminal.
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package cmdinstall
Hit:1 https://deb.nodesource.com/node_8.x artful InRelease
Hit:2 http://us.archive.ubuntu.com/ubuntu artful InRelease
Hit:3 http://security.ubuntu.com/ubuntu artful-security InRelease
Hit:4 http://us.archive.ubuntu.com/ubuntu artful-updates InRelease
Hit:5 http://us.archive.ubuntu.com/ubuntu artful-backports InRelease
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'cmdtest' instead of 'yarn'
The following packages were automatically installed and are no longer required:
linux-headers-4.10.0-40 linux-headers-4.10.0-40-generic linux-image-4.10.0-40-generic linux-image-extra-4.10.0-40-generic
Use 'sudo apt autoremove' to remove them.
The following NEW packages will be installed:
cmdtest
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/19.4 kB of archives.
After this operation, 80.9 kB of additional disk space will be used.
Selecting previously unselected package cmdtest.
(Reading database ... 240780 files and directories currently installed.)
Preparing to unpack .../cmdtest_0.27-1_all.deb ...
Unpacking cmdtest (0.27-1) ...
Setting up cmdtest (0.27-1) ...
Processing triggers for man-db (2.7.6.1-2) ...
I also using ubuntu 17.10 use below code to install yarn
sudo apt-get remove cmdtest; sudo apt update; sudo apt-get install yarn
I also just ran into this issue.
Remove cmdtest
sudo apt-get purge cmdtest
install yarn manually
cd /opt
wget https://yarnpkg.com/latest.tar.gz
tar zvxf latest.tar.gz
Yarn is now in /opt/yarn-[version]/
Add this to your profile: export PATH="$PATH:/opt/yarn-[version]/bin" (the path may vary depending on where you extracted Yarn to)
In case it's helpful, I ran into this because I didn't notice that the apt repository for yarn wasn't getting used due to:
Reading package lists... Done
E: The method driver /usr/lib/apt/methods/https could not be found.
N: Is the package apt-transport-https installed?
E: Failed to fetch https://dl.yarnpkg.com/debian/dists/stable/InRelease
E: Some index files failed to download. They have been ignored, or old ones used instead.
Running sudo apt-get install apt-transport-https; sudo apt-get update; sudo apt-get install --no-install-recommends yarn
did the trick.
guys the apt-get install instead of apt install hacks no longer works even if you add --no-install-recommends.
now cmdtest installs no matter what you do.
I don't see how this can happen.
cmdtest is called cmdtest yarn is called yarn those are completely different names and completely unrelated packages with completely uncomparable popularity. yarn is in the default repos we shouldn't have to be resorting to an external repo to get it installed!!
Most helpful comment
@vitalymak this is an abomination. I ran into the same issue and this resolved it:
sudo apt-get remove cmdinstall;sudo apt update;sudo apt-get install yarn