Deno 2.0
Workspaces and monorepos
Directory Structure
.
├── deno.json
├── main.ts
└── packages
├── add
│ ├── deno.json
│ └── index.ts
└── subtract
├── deno.json
└── index.ts
workspace
の属性を使用。
json
{
"workspace": [
"packages/add",
"packages/subtract"
]
}
packages/add
ts
export function add(a: number, b: number): number {
return a + b
}
json
{
"name": "@deno/add",
"exports": "./index.ts"
}
packages/subtract
ts
import { add } from '@deno/add'
export function subtract(a: number, b: number): number {
return add(a, -b)
}
json
{
"name": "@deno/subtract",
"exports": "./index.ts"
}
ts
import { add } from '@deno/add'
import { subtract } from '@deno/subtract'
console.log('Hello Deno')
const add_res = add(1, 2)
console.log(add_res)
const subtract_res = subtract(1, 2)
console.log(subtract_res)
sh
deno main.ts
Hello Deno
3
-1
Points to note
json
{
"name": "@deno/add"
}
"exports":
を指定しないと、
sh
deno main.ts
Warning "exports" field should be specified when specifying a "name".
at file:///workspaces/deno-workspaces-test/packages/add/deno.json
error: Unknown export '.' for '@deno/add'.
Package exports:
at file:///workspaces/deno-workspaces-test/main.ts:1:21
Package management
- Package management with new
deno install
,deno add
, anddeno remove
commands
deno add
バージョン指定しない場合、最新のパッケージ。
sh
deno add npm:hono
json
{
"dependencies": {
"hono": "^4.6.4"
}
}
パッケージ名の後ろに「@バージョン」をつけて行うことも可能。
sh
deno add npm:hono@4.0.0
json
{
"dependencies": {
"hono": "^4.0.0"
}
}
--dev
バージョン指定しない場合、最新のパッケージ。
sh
deno add --dev npm:vitest
json
{
"devDependencies": {
"vitest": "^2.1.2"
}
}
パッケージ名の後ろに「@バージョン」をつけて行うことも可能。
sh
deno add --dev npm:vitest@2.0.1
json
{
"devDependencies": {
"vitest": "^2.0.1"
}
}
deno remove
remove before
json
{
"dependencies": { "hono": "^4.6.4" },
"devDependencies": {
"vitest": "^2.1.3"
}
}
sh
deno remove hono
Removed hono
remove after
json
{
"devDependencies": { "vitest": "^2.1.3" }
}
remove before
json
{
"devDependencies": { "vitest": "^2.1.3" }
}
sh
deno remove vitest
remove after
json
{
}
Points to note
deno add
の時は、npm:hono
だが、deno remove
と時は、hono
と指定する。
sh
deno remove npm:hono
No packages were removed
remove
の時は、バージョンを指定しても削除できません。
sh
deno remove npm:hono@4.0.0
No packages were removed
sh
deno remove hono@4.0.0
No packages were removed
remove
の時は、--dev
を使用しても削除できません。
sh
deno remove --dev vitest
error: unexpected argument '--dev' found
tip: to pass '--dev' as a value, use '-- --dev'
Usage: deno remove [OPTIONS] [packages]...
deno install
以下のような機能と同様。
npm install
pnpm install
yarn install
bun install
sh
deno install
Vitest Example
Directory Structure
.
├── deno.json
├── package.json
├── packages
│ └── fizz-buzz
│ ├── deno.json
│ ├── index.test.ts
│ └── index.ts
└── src
└── index.ts
ts
import { fizzBuzz } from '@deno/fizz-buzz'
const fizz_buzz_result = fizzBuzz(15)
console.log(fizz_buzz_result)
sh
deno src/index.ts
FizzBuzz
ts
export const fizzBuzz = (number: number): string => {
if (number % 15 === 0) return 'FizzBuzz'
if (number % 3 === 0) return 'Fizz'
if (number % 5 === 0) return 'Buzz'
return number.toString()
}
ts
import { describe, expect, it } from 'vitest'
import { fizzBuzz } from './index.ts'
// deno-fmt-ignore
const input: number[] = [
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100
]
// deno-fmt-ignore
const expected: string[] = [
"1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz",
"11", "Fizz", "13", "14", "FizzBuzz", "16", "17", "Fizz", "19", "Buzz",
"Fizz", "22", "23", "Fizz", "Buzz", "26", "Fizz", "28", "29", "FizzBuzz",
"31", "32", "Fizz", "34", "Buzz", "Fizz", "37", "38", "Fizz", "Buzz",
"41", "Fizz", "43", "44", "FizzBuzz", "46", "47", "Fizz", "49", "Buzz",
"Fizz", "52", "53", "Fizz", "Buzz", "56", "Fizz", "58", "59", "FizzBuzz",
"61", "62", "Fizz", "64", "Buzz", "Fizz", "67", "68", "Fizz", "Buzz",
"71", "Fizz", "73", "74", "FizzBuzz", "76", "77", "Fizz", "79", "Buzz",
"Fizz", "82", "83", "Fizz", "Buzz", "86", "Fizz", "88", "89", "FizzBuzz",
"91", "92", "Fizz", "94", "Buzz", "Fizz", "97", "98", "Fizz", "Buzz"
]
const testCases = input.map((i, o) => {
return { input: i, expected: expected[o] }
})
describe('fizzBuzz test', () => {
// fizzBuzz
it.concurrent.each(testCases)('fizzBuzz($input) -> $expected', ({ input, expected }) => {
const result = fizzBuzz(input)
expect(result).toEqual(expected)
})
})
Test
package.json
のscripts
からでも実行可能。
- deno task can now run package.json scripts
json
{
"scripts": {
"test": "vitest"
},
"devDependencies": {
"vitest": "^2.1.2"
}
}
sh
deno task test
json
{
"tasks": {
"vitest": "vitest"
}
}
sh
deno task test
Details
sh
Task test vitest
DEV v2.1.2 /workspaces/deno-workspaces-test
✓ packages/fizz-buzz/index.test.ts (100)
✓ fizzBuzz test (100)
✓ fizzBuzz(1) -> '1'
✓ fizzBuzz(2) -> '2'
✓ fizzBuzz(3) -> 'Fizz'
✓ fizzBuzz(4) -> '4'
✓ fizzBuzz(5) -> 'Buzz'
✓ fizzBuzz(6) -> 'Fizz'
✓ fizzBuzz(7) -> '7'
✓ fizzBuzz(8) -> '8'
✓ fizzBuzz(9) -> 'Fizz'
✓ fizzBuzz(10) -> 'Buzz'
✓ fizzBuzz(11) -> '11'
✓ fizzBuzz(12) -> 'Fizz'
✓ fizzBuzz(13) -> '13'
✓ fizzBuzz(14) -> '14'
✓ fizzBuzz(15) -> 'FizzBuzz'
✓ fizzBuzz(16) -> '16'
✓ fizzBuzz(17) -> '17'
✓ fizzBuzz(18) -> 'Fizz'
✓ fizzBuzz(19) -> '19'
✓ fizzBuzz(20) -> 'Buzz'
✓ fizzBuzz(21) -> 'Fizz'
✓ fizzBuzz(22) -> '22'
✓ fizzBuzz(23) -> '23'
✓ fizzBuzz(24) -> 'Fizz'
✓ fizzBuzz(25) -> 'Buzz'
✓ fizzBuzz(26) -> '26'
✓ fizzBuzz(27) -> 'Fizz'
✓ fizzBuzz(28) -> '28'
✓ fizzBuzz(29) -> '29'
✓ fizzBuzz(30) -> 'FizzBuzz'
✓ fizzBuzz(31) -> '31'
✓ fizzBuzz(32) -> '32'
✓ fizzBuzz(33) -> 'Fizz'
✓ fizzBuzz(34) -> '34'
✓ fizzBuzz(35) -> 'Buzz'
✓ fizzBuzz(36) -> 'Fizz'
✓ fizzBuzz(37) -> '37'
✓ fizzBuzz(38) -> '38'
✓ fizzBuzz(39) -> 'Fizz'
✓ fizzBuzz(40) -> 'Buzz'
✓ fizzBuzz(41) -> '41'
✓ fizzBuzz(42) -> 'Fizz'
✓ fizzBuzz(43) -> '43'
✓ fizzBuzz(44) -> '44'
✓ fizzBuzz(45) -> 'FizzBuzz'
✓ fizzBuzz(46) -> '46'
✓ fizzBuzz(47) -> '47'
✓ fizzBuzz(48) -> 'Fizz'
✓ fizzBuzz(49) -> '49'
✓ fizzBuzz(50) -> 'Buzz'
✓ fizzBuzz(51) -> 'Fizz'
✓ fizzBuzz(52) -> '52'
✓ fizzBuzz(53) -> '53'
✓ fizzBuzz(54) -> 'Fizz'
✓ fizzBuzz(55) -> 'Buzz'
✓ fizzBuzz(56) -> '56'
✓ fizzBuzz(57) -> 'Fizz'
✓ fizzBuzz(58) -> '58'
✓ fizzBuzz(59) -> '59'
✓ fizzBuzz(60) -> 'FizzBuzz'
✓ fizzBuzz(61) -> '61'
✓ fizzBuzz(62) -> '62'
✓ fizzBuzz(63) -> 'Fizz'
✓ fizzBuzz(64) -> '64'
✓ fizzBuzz(65) -> 'Buzz'
✓ fizzBuzz(66) -> 'Fizz'
✓ fizzBuzz(67) -> '67'
✓ fizzBuzz(68) -> '68'
✓ fizzBuzz(69) -> 'Fizz'
✓ fizzBuzz(70) -> 'Buzz'
✓ fizzBuzz(71) -> '71'
✓ fizzBuzz(72) -> 'Fizz'
✓ fizzBuzz(73) -> '73'
✓ fizzBuzz(74) -> '74'
✓ fizzBuzz(75) -> 'FizzBuzz'
✓ fizzBuzz(76) -> '76'
✓ fizzBuzz(77) -> '77'
✓ fizzBuzz(78) -> 'Fizz'
✓ fizzBuzz(79) -> '79'
✓ fizzBuzz(80) -> 'Buzz'
✓ fizzBuzz(81) -> 'Fizz'
✓ fizzBuzz(82) -> '82'
✓ fizzBuzz(83) -> '83'
✓ fizzBuzz(84) -> 'Fizz'
✓ fizzBuzz(85) -> 'Buzz'
✓ fizzBuzz(86) -> '86'
✓ fizzBuzz(87) -> 'Fizz'
✓ fizzBuzz(88) -> '88'
✓ fizzBuzz(89) -> '89'
✓ fizzBuzz(90) -> 'FizzBuzz'
✓ fizzBuzz(91) -> '91'
✓ fizzBuzz(92) -> '92'
✓ fizzBuzz(93) -> 'Fizz'
✓ fizzBuzz(94) -> '94'
✓ fizzBuzz(95) -> 'Buzz'
✓ fizzBuzz(96) -> 'Fizz'
✓ fizzBuzz(97) -> '97'
✓ fizzBuzz(98) -> '98'
✓ fizzBuzz(99) -> 'Fizz'
✓ fizzBuzz(100) -> 'Buzz'
Test Files 1 passed (1)
Tests 100 passed (100)
Start at 12:41:35
Duration 283ms (transform 36ms, setup 0ms, collect 41ms, tests 6ms, environment 0ms, prepare 105ms)