Giriş yapmadınız.

Duyuru

TÜRKÇE KİTAP DUYURUSU:
Laravel 5 : Laravel 5.1 Güzelliği (Türkçe)
Vue.js 2 : Vue.js 2 Majesteleri (Türkçe)

#1 16.12.2018 10:19:58

coder2
Üye
Yer: Antalya
Kayıtlı: 09.12.2018
Mesajlar: 9

Projeyi paket haline getirme

Merhabalar,

Kendi kullandığım bootstrap componentlerini veya admin panelimi nasıl paket haline getirebilirim.
İstediğim şey componentlerim veya admin panelini istediğim projeye ekleyebileyim.
Ayrıca packagist te projemi composer e yüklemek dışında bir yontem varsa yani localde kendi paketimi oluşturup istediğim projeme ekleyebilmem mümkünse bu seçeneği tercih ederim.

Sanırım çok uzattım. Yazdığım kodları nasıl paket haline getirebilirim ?

Çevrimdışı

#2 16.12.2018 10:39:35

deathisonitsway
Üye
Kayıtlı: 01.02.2016
Mesajlar: 375

Yanıt: Projeyi paket haline getirme

composer paketi aslında bir vendor çalışması demektir.Böyle bir paket için laravelin service provider yönteminin nasıl çalıştığını bilmeniz gerekir.Yani yapılan bir admin dizinin ilgili yerlere nasıl yazılacağını yada taşınacağını laravel paketi yaparak sağlayabilirsiniz.Bunun için de yazılmış paketlerin nasıl publish edildiklerine bakarak öğrenebilirsiniz.

Composer paketi dışında reponuzda durması zaten başlı başına bir paket gibidir diyebiliriz.istediğiniz yere clone ederekte kurabilirsiniz.
Sonuc olarak nasıl bir yol izleyeceğiniz sizinle ilgili bir şey.


Laravel does not save you. Php knowledge only save you. Do not become a Laravel programmer, just the opposite,become php developer.

Çevrimdışı

#3 16.12.2018 16:42:46

coder2
Üye
Yer: Antalya
Kayıtlı: 09.12.2018
Mesajlar: 9

Yanıt: Projeyi paket haline getirme

repoda ilgili paketi tutmak daha kolay olacaktır.

Bununla beraber service provider kullanarak paket oluşturmak için ufak bir araştırma yaptım. İngilizcem yeterli gelmediği için pek birşey elde edemedim. Türkçe kaynak olarak da http://mahmutbayri.com/2015/laravel-5-paket-gelistirme/ sayfası ve ilgili sitenin diğer sayfalarını detaylıca okudum fakat kafam bir türlü almadı.

Laravel ile yapmak istediğim şeylerin çoğunu yapabiliyorum. İngilizcem ise orta düzey. Service providerlerin çalışma şeklini ve paket oluşturmak için nasıl kullanabileceğimi oğrenmem için tavsiyeniz varsa almak isterim.

Çevrimdışı

#4 16.12.2018 18:37:58

evrend
Üye
Yer: DÜZCE
Kayıtlı: 26.05.2014
Mesajlar: 369
Website

Yanıt: Projeyi paket haline getirme

İngilizceniz orta seviye ise ve laravel/php konusunda tecrübeniz varsa, direk dökümanı inceleyin. Size bu iş için yol gösterecek en değerli kaynaklardan birisi dökümandır.
https://laravel.com/docs/5.7/packages

Local'de paket geliştirirken aşağıdaki şekilde çalışabilirsiniz ve geliştirdiğiniz paketleri copy/paste yaparak yine aşağıdaki şekilde projelerinize dahil edebilirsiniz. Local'den repo eklemek için "repositories" bölümünde lokal repomuzu ekleyip, require bölümünde projemize dahil ediyoruz. Repolar github, bitbucket, üzerinden, zip olarak vb yöntemlerle eklenebilir.
- repositories içerisindeki symlink önemlidir, vendor klasörünün içerisine link olarak klasörü ekler.
- Admin panelde kullanılan Css, js gibi dosyalarınızı laravelin publish yöntemleri ile ilgili klasörlere publish edebilir yada link olarak public klasöründe yayınlayabilirsiniz.
- Uzun süredir şirket içerisinde bütün laravel projelerimizi aşağıdaki şekilde paket olarak geliştiriyoruz.
https://getcomposer.org/doc/05-repositories.md

Laravel projenizin composer.json dosyası;

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": [
        "framework",
        "laravel"
    ],
    "license": "MIT",
    "type": "project",
    "repositories": {
        "arsiv": {
            "type": "path",
            "url": "herkod/arsiv",
            "options": {
                "symlink": true
            }
        }
    },
    "require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
        "herkod/arsiv": "dev-master",
        "laravel/framework": "5.7.*",
        "laravel/tinker": "^1.0"
    },
    "require-dev": {
        "beyondcode/laravel-dump-server": "^1.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^2.0",
        "phpunit/phpunit": "^7.0"
    },
    "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "scripts": {
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate"
        ],
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover"
        ]
    },
    "config": {
        "preferred-install": "dist",
        "sort-packages": true,
        "optimize-autoloader": true
    },
    "minimum-stability": "dev",
    "prefer-stable": true
}

Paketinizin composer.json dosyası;

{
    "name": "herkod/arsiv",
    "description": "News Archive Management System",
    "type": "laravel application",
    "authors": [
        {
            "name": "Herkod Inc.",
            "email": "[email protected]"
        }
    ],
    "require": {
        "barryvdh/laravel-cors": "^0.11.0",
        "laravel/passport": "^6.0",
        "spatie/laravel-permission": "^2.14",
        "spatie/laravel-tags": "^2.1",
        "barryvdh/laravel-elfinder": "^0.4.1"
    },
    "autoload": {
        "psr-4": {
            "Herkod\\": "src/",
            "Herkod\\Seeds\\": "database/seeds/"
        }
    },
    "minimum-stability": "dev",
    "prefer-stable": true,
    "extra": {
        "laravel": {
            "providers": [
                "Herkod\\AppServiceProvider"
            ],
            "aliases": {}
        }
    }
}

Bizim yapımızda kullandığımız örnek ServiceProvider;

<?php

namespace Herkod;

use Illuminate\Support\ServiceProvider;
use Illuminate\Routing\Router;
use Broadcast;
use Response;
use Schema;
use Route;

class AppServiceProvider extends ServiceProvider
{
    public function boot(Router $router)
    {
        #Sucucudaki "Specified key was too long; max key length is 767 bytes" hatası için;
        Schema::defaultStringLength(191);

        # Artisan komutumuzu kayıt ediyoruz.
        $this->commands([
            \Herkod\Common\Console\Commands\HerkodUp::class,
        ]);

        # Migration dosyalarımızı yüklüyoruz.
        $this->loadMigrationsFrom(__DIR__.'/../database/migrations');

        # Varsa Language dosyalarımızı yüklüyoruz.
        $this->loadTranslationsFrom(__DIR__.'/../lang', 'herkod');

        Response::macro('success', function ($data, $message = '') {
            return Response::json([
                'success'  => true,
                'message' => $message,
                'data' => $data,
            ]);
        });

        $router->aliasMiddleware('role', \Spatie\Permission\Middlewares\RoleMiddleware::class);
        $router->aliasMiddleware('permission', \Spatie\Permission\Middlewares\PermissionMiddleware::class);

        Route::prefix('api')
            ->middleware('api')
            ->namespace('Herkod')
            ->group(__DIR__.'/routes.php');

        Broadcast::routes();

        require(__DIR__.'/helper.php');
    }

    public function register()
    {
        if (env('PUBLIC_PATH') !== null) {
            $this->app['path.public'] = base_path() . env('PUBLIC_PATH');
        }
    }
}

Yukarıdaki composer dosyalarının laravel içerisinde hiyerarşisi;
composer.jpg

Son düzenleyen evrend (16.12.2018 18:44:05)


Unutmayın, HERKOD aynı değildir.
Fiyat/Performans Cloud için: Digital Ocean.
Ayda 2,5$'a 512Mb ram, 1Core CPU Cloud için: Vultr.

Çevrimdışı

#5 16.12.2018 19:35:52

coder2
Üye
Yer: Antalya
Kayıtlı: 09.12.2018
Mesajlar: 9

Yanıt: Projeyi paket haline getirme

Değerli yorumlarınız için teşekkür ederim. @deathisonitsway @evrend
Service provider ile ilerleyerek paket konusuna gireceğim. Takıldığım noktalar olursa bu başlık altında tekrar belirtirim.

Çevrimdışı

#6 22.12.2018 21:18:55

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,420
Website

Yanıt: Projeyi paket haline getirme

composer.json dosyasına şu şekilde ekliyorsunuz:

"repositories": [
  {
    "type": "vcs",
    "url": "https://github.com/benimrepom/benimpaketim"
  }
],
"require": {
  "benimrepom/benimpaketim": "dev-master"
},

Burada şöyle bir nokta var. Branch yazarken başına dev- ekliyorsunuz. Yani branch master ise üstte yazdığım gibi dev-master yazıyorsunuz. Sizin branchın başında diyelim ki zaten dev var. Yine de yazıyorsunuz, yani dev-dev-master oluyor.

Bu şekilde kendi paketlerinizi Packagist'e göndermeden kullanabilirsiniz.

Çevrimdışı

#7 23.12.2018 16:54:00

elementaryos
Üye
Kayıtlı: 20.04.2017
Mesajlar: 168

Yanıt: Projeyi paket haline getirme

Benim yönetimi söyleyeyim.
packages adlı bir klasör oluştur ana dizine.
İçerisine kendi git ismiyle klasör aç. Onun içerisine de eklentinin ismi ile bir tane aç.
Son olarak "src" adında bir klasör daha açtığında. Bu mantıkla diğer paketleri düzenleyebilirsin.

Src dizininede örnek "EklentiServiceProvider.php" adında dosya açacaksın ki zaten "service provider"ların yani "Hizmet sağlayıcı"nın paketleri laravel bu sağlayıcılar aracılığıyla  tanıttığını biliyorsundur.

Daha sonra normal laravel yazar gibi içerisine "middleware, trait, config, view, lang, models, controllers, routes" dosyaları oluşturman gerekiyor.
Paket yazmanın temellerinden bahsediyorum şuan.
Tabi composer içine ilk önce yolu tanıtmak için bu şekilde dahil edilebilir.

"autoload": {
        "files":[
            "app/Helpers.php"
        ],
        "psr-4": {
            "App\\": "app/",
             "Fizikci\\Sohbet\\": "packages/fizikci/sohbet/src"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },

SohbetServiceProvider içinde de  isim uzayı "namespace Fizikci\Sohbet;" şeklinde olmalı.
Config/app.php içerisinde providers'ların içine örnekle
Fizikci\Sohbet\SohbetServiceProvider::class,
diyerek gidebilirsin. Kısaca o ayrı bir paket olarak geliştirme boyunca seninle birlikte olacak. Buradan okuyabildiğine göre başka birşeye ihtiyacın olmayacaktır.

Tabi ilgili mvc yapısını boot ve register kısmında tanımlayabilirsin. Laravelin kendi dökümantasyonun yer alıyor. Bu işlemlerden sonra herşey yolunda olduğunu kontrol etmek amacıyla "composer dump-autoload" yapmanız gerekmekte.
https://laravel.com/docs/5.7/packages

Eğer paketi tamamlayıp ovveride ile temaya uyumlu hale getirmek isterseniz veya üstüne proje için güncellemek gerekirse, vendor publish olayına bakabilirsin. Yaptığı şey packages içinden çıkarıp normal view ve public şeklinde dosyaların içlerine aynı dosyayı atmak. Orası değiştirse paket içeriği değişmeden kullanılabilir. Bu vendor ana dizinde ki değil yalnız.
Zaten ana dizine geldiğinde composer update ile birlikte gideceği için paketin özelleştirilmesi büyük hata olur bu nedenle ovveride yani üstüne yazma yöntemi tüm çevrelerde uygulanıyor.

Bu şekilde önce gite yükleyip oradan packagiste eklemek istersen de bir kaç dakikalık işlem.

Son düzenleyen elementaryos (23.12.2018 16:59:04)

Çevrimdışı

Forum alt kısmı