আমি কীভাবে আমার সংস্থার গোপনীয় গবেষণা কোড থেকে ওপেন সোর্স কোড রিলিজগুলি পরিচালনা করতে পারি?


13

আমার সংস্থায় (আসুন তাদের এ্যাকমে টেকনোলজি বলি) প্রায় এক হাজার উত্স ফাইলগুলির একটি লাইব্রেরি রয়েছে যা মূলত তার একমে ল্যাবস গবেষণা গ্রুপ থেকে এসেছিল, কয়েক বছরের জন্য একটি ডেভলপমেন্ট গ্রুপে সঞ্চারিত হয়েছিল এবং আরও সাম্প্রতিক সময়ে মুষ্টিমেয় গ্রাহকদের জন্য সরবরাহ করা হয়েছে অপ্রকাশ। অ্যাকমে সম্ভবত 75% কোড ওপেন সোর্স সম্প্রদায়ে প্রকাশ করতে প্রস্তুত হচ্ছে। অন্যান্য 25% পরে মুক্তি পাবে, তবে আপাতত গ্রাহক ব্যবহারের জন্য প্রস্তুত নয় বা ভবিষ্যতের উদ্ভাবনের সাথে সম্পর্কিত কোড রয়েছে যা তাদের প্রতিযোগীদের হাত থেকে দূরে রাখতে হবে to

কোডটি বর্তমানে #ifdefs এর সাথে ফর্ম্যাট করা হয়েছে যা একই কোড বেসটিকে প্রাক-উত্পাদন প্ল্যাটফর্মগুলির সাথে কাজ করার অনুমতি দেয় যা বিশ্ববিদ্যালয়ের গবেষকগণ এবং বাণিজ্যিক গ্রাহকদের একাধিক বিস্তৃত পরিসীমা যখন এটি ওপেন সোর্সে চলে যায়, একই সময়ে থাকবে ভবিষ্যতের প্ল্যাটফর্মের সাথে পরীক্ষামূলক এবং প্রোটোটাইপিং এবং সামনের সামঞ্জস্য পরীক্ষার জন্য উপলব্ধ। আমার গোষ্ঠীর অর্থনীতি (এবং বিচক্ষণতা) ​​এর জন্য একটি একক কোড বেস রাখা অপরিহার্য বলে বিবেচিত হয় যাদের সমান্তরালভাবে দুটি অনুলিপি বজায় রাখা কঠিন সময় কাটাতে পারে।

আমাদের বর্তমান বেসের ফাইলগুলি এরকম কিছু দেখায়:

> // Copyright 2012 (C) Acme Technology, All Rights Reserved.
> // Very large, often varied and restrictive copyright license in English and French,
> // sometimes also embedded in make files and shell scripts with varied 
> // comment styles. 
> 
> 
>   ... Usual header stuff...
>
> void initTechnologyLibrary() {
>     nuiInterface(on);
> #ifdef  UNDER_RESEARCH
>     holographicVisualization(on);
> #endif
> }

এবং আমরা এগুলিকে এমন কিছুতে রূপান্তর করতে চাই:

> // GPL Copyright (C) Acme Technology Labs 2012, Some rights reserved.
> // Acme appreciates your interest in its technology, please contact xyz@acme.com 
> // for technical support, and www.acme.com/emergingTech for updates and RSS feed.
> 
>   ... Usual header stuff...
>
> void initTechnologyLibrary() {
>     nuiInterface(on);
> }

এমন কোনও সরঞ্জাম, পার্স লাইব্রেরি, বা জনপ্রিয় স্ক্রিপ্ট রয়েছে যা কপিরাইটটি প্রতিস্থাপন করতে পারে এবং কেবল #ifdefs নয়, #if সংজ্ঞায়িত (UNDER_RESEARCH) ইত্যাদির মতো বিভিন্নতা আনতে পারে?

কোডটি বর্তমানে গিটে রয়েছে এবং সম্ভবত কোথাও গিট ব্যবহার করা হবে। নিরাপদে ভাণ্ডারগুলিকে একত্রে লিঙ্ক করার কোনও উপায় থাকবে যাতে আমরা ওপেন সোর্স সংস্করণগুলির সাথে আমাদের উন্নতিগুলি দক্ষতার সাথে পুনরায় সংহত করতে পারি? অন্যান্য ক্ষতি সম্পর্কে পরামর্শ স্বাগত।


13
এই কোডবেসটি শাখার জন্য চিৎকার করছে।
ফ্লোরিয়ান মার্জাইন

এই উদ্দেশ্যে শাখা ব্যবহার করার একটি উদাহরণ সবচেয়ে স্বাগত হবে।
বিকাশকারী

উত্তর:


6

এটি দেখে মনে হচ্ছে এটা খুব কঠিন preprocessors বিশ্লেষণ করতে একটি স্ক্রিপ্ট লিখতে হবে না, তাদের সংজ্ঞায়িত ধ্রুবক (একটি তালিকা তুলনা UNDER_RESEARCH, FUTURE_DEVELOPMENTইত্যাদি) এবং যদি নির্দেশ মিথ্যা প্রদত্ত কি সংজ্ঞায়িত হচ্ছে, আপ অপসারণ সবকিছু মূল্যায়ন করা যাবে পরের দিকে #endif

পাইথনে আমি এমন কিছু করতাম,

import os

src_dir = 'src/'
switches = {'UNDER_RESEARCH': True, 'OPEN_SOURCE': False}
new_header = """// GPL Copyright (C) Acme Technology Labs 2012, Some rights reserved.
// Acme appreciates your interest in its technology, please contact xyz@acme.com 
// for technical support, and www.acme.com/emergingTech for updates and RSS feed.
"""

filenames = os.listdir(src_dir)
for fn in filenames:
    contents = open(src_dir+fn, 'r').read().split('\n')
    outfile = open(src_dir+fn+'-open-source', 'w')
    in_header = True
    skipping = False
    for line in contents:
        # remove original header
        if in_header and (line.strip() == "" or line.strip().startswith('//')):
            continue
        elif in_header:
            in_header = False
            outfile.write(new_header)

        # skip between ifdef directives
        if skipping:
            if line.strip() == "#endif":
                skipping = False
            continue
        # check
        if line.strip().startswith("#ifdef"):
            # parse #ifdef (maybe should be more elegant)
            # this assumes a form of "#ifdef SWITCH" and nothing else
            if line.strip().split()[1] in switches.keys():
                skipping = True
                continue

        # checking for other forms of directives is left as an exercise

        # got this far, nothing special - echo the line
        outfile.write(line)
        outfile.write('\n')

আমি নিশ্চিত যে এটি করার জন্য আরও মার্জিত উপায় রয়েছে তবে এটি দ্রুত এবং নোংরা এবং কাজটি সম্পন্ন বলে মনে হচ্ছে।


ওহ ধন্যবাদ. একটি ভাল ফিল্টার তৈরি করার জন্য প্রচুর যুক্তি রয়েছে এবং আমি আপনার উদাহরণটির প্রশংসা করি। আমি পুনঃব্যবহারের জন্য কিছু খুঁজে পেতে আশা করি এবং আমার বিকাশ মেশিনটি একটি বড় মেমরির সাথে দ্রুত তাই কপিরাইট এবং সংজ্ঞায়িতগুলির জন্য পৃথক ফিল্টার চালানো বা একাধিকবার সংজ্ঞায়িত ফিল্টার চালানো পারফরম্যান্স খুব বড় উদ্বেগ নয়। আমাদের কাছে এমন কীওয়ার্ড সম্পর্কিত একাধিক সংজ্ঞা রয়েছে যা ভবিষ্যতের একাধিক প্রকল্প এবং কিছু দু'টি অতীতে প্রজেক্ট নির্ধারণ করে যা ওপেন সোর্স প্রকাশিত হবে না, তবে এখনও অভ্যন্তরীণভাবে এবং গ্রাহকদের গ্রহণের মাধ্যমে প্রাথমিকভাবে ব্যবহৃত হয়।
ডেভেলপারডন

3

আমি কেবলমাত্র ম্যাক্রোগুলি প্রসারণ করতে প্রিপ্রসেসরের মাধ্যমে আপনার কোডটি পাস করার বিষয়ে ভাবছিলাম, সুতরাং এসগুলির মধ্যে কেবল আকর্ষণীয় অংশটি আউটপুট করে #ifdef

এর মতো কিছু কাজ করা উচিত:

gcc -E yourfile.c

কিন্তু:

  • আপনি সমস্ত মন্তব্য হারাবেন। আপনি -CCএগুলি সংরক্ষণ করতে (ধরণের) ব্যবহার করতে পারেন তবে তারপরে আপনাকে পুরানো কপিরাইট বিজ্ঞপ্তিটি সরিয়ে ফেলতে হবে
  • #includeগুলি খুব প্রসারিত হয়, সুতরাং আপনি অন্তর্ভুক্ত শিরোলেখ ফাইলগুলির সমস্ত বিষয়বস্তুযুক্ত একটি বড় ফাইল শেষ করতে পারেন
  • আপনি "স্ট্যান্ডার্ড" ম্যাক্রোগুলি হারাবেন।

কোন ম্যাক্রোগুলি প্রসারিত তা সীমাবদ্ধ করার উপায় রয়েছে; তবে আমার পরামর্শটি এখানে ফাইলগুলি (সম্ভাব্য বিপজ্জনক) প্রসেসিংয়ের পরিবর্তে জিনিসগুলি বিভক্ত করা (উপায় দ্বারা, আপনি কীভাবে এগুলি পরে রক্ষণাবেক্ষণের পরিকল্পনা করবেন? যেমন ওপেনসোর্স সংস্করণ থেকে কোডটি আপনার বদ্ধ উত্সে পুনরায় প্রবর্তন করবেন?)।

এটি, আপনি যতটা সম্ভব বাহ্যিক লাইব্রেরিতে ওপেনসোর্স করতে চান এমন কোডটি চেষ্টা করার চেষ্টা করুন, তারপরে অন্যান্য "কাস্টম" ক্লোজড-সোর্স লাইব্রেরির সাথে সংহত করে অন্য যে কোনও লাইব্রেরির সাথে আপনি যেমন ব্যবহার করেন তেমন সেগুলি ব্যবহার করুন।

কীভাবে জিনিসগুলিকে পুনর্গঠন করা যায় তা নির্ধারণ করতে প্রথমে কিছুটা বেশি সময় লাগতে পারে তবে এটি সম্পাদন করার এটি অবশ্যই সঠিক উপায়।


আমরা বিবেচনা করেছি যে এমন কিছু আছে যা প্রিপ্রোসেসর দিয়ে নির্বাচিতভাবে যে ব্লকগুলি আমরা প্রকাশ করব না তা নির্বাচিতভাবে মুছে ফেলার জন্য করা যেতে পারে। কোডটি জটিল এবং আমাদের সম্ভবত কম পরিবর্তে আরও কমেন্টের প্রয়োজন হবে, তবে আপনার পরামর্শটি অবশ্যই মস্তিষ্কের তালিকায় রাখার মতো। আমরা কীভাবে উত্স বজায় রাখার পরিকল্পনা করি এবং কোডটি পিছনে এবং সম্প্রদায়ে এগিয়ে নিয়ে যায় সে সম্পর্কে আরও ডাব্লুআরটি প্রশ্ন রয়েছে, আরও পরিকল্পনা করার দরকার রয়েছে। মালিকানাধীন কোডে কোড আনা কিছু ভাল প্রশ্ন উত্থাপন করে।
ডেভেলপারডন

2

আমার একটি সমাধান আছে তবে এটির জন্য একটু কাজ প্রয়োজন

পাইপপ্রসেসর একটি লাইব্রেরি যা পাইথনের জন্য খাঁটি সি স্টাইলের প্রিপ্রোসেসর সরবরাহ করে যা অন্যান্য ধরণের উত্স কোডের জন্য জিপিপি (সাধারণ উদ্দেশ্য প্রাক-প্রসেসর) হিসাবেও ব্যবহার করা যেতে পারে।

এখানে একটি প্রাথমিক উদাহরণ:

from pypreprocessor import pypreprocessor

pypreprocessor.input = 'input_file.c'
pypreprocessor.output = 'output_file.c'
pypreprocessor.removeMeta = True
pypreprocessor.parse()

প্রিপ্রসেসর অত্যন্ত সহজ। এটি উত্সটি দিয়ে একটি পাস করে এবং শর্তসাপেক্ষে কী সংজ্ঞায়িত হয় তার ভিত্তিতে উত্সকে মন্তব্য করে।

সংজ্ঞাগুলি উত্সে # সংজ্ঞায়িত বিবৃতিগুলির মাধ্যমে বা পাইপপ্রসেসর.ডিফাইনস তালিকায় সেট করে সেট করা যেতে পারে ।

ইনপুট / আউটপুট প্যারামিটার সেট করা আপনাকে স্পষ্টভাবে সংজ্ঞায়িত করতে দেয় যে কোন ফাইলগুলি খোলা / বন্ধ হচ্ছে তাই একক প্রিপ্রসেসর ব্যাচ প্রসেসের জন্য সেট করতে পারেন যদি ইচ্ছা হয় তবে বৃহত সংখ্যক ফাইল files

অপসারণের মেটা প্যারামিটারটি সত্য হিসাবে সেট করা, প্রিপ্রেসেসরটি স্বয়ংক্রিয়ভাবে কোনও পোস্ট-প্রসেসড কোড রেখে কোনও প্রিপ্রসেসরের বিবৃতি স্বয়ংক্রিয়ভাবে বের করতে হবে।

দ্রষ্টব্য: সাধারণত এটি পরিষ্কারভাবে সেট করার দরকার হয় না কারণ বাইকোড সংকলনের সময় পাইথন মন্তব্য কোডটি স্বয়ংক্রিয়ভাবে সরিয়ে ফেলেছিল।

আমি কেবল একটি প্রান্ত মামলা দেখতে পাচ্ছি। যেহেতু আপনি সি উত্স প্রিপ্রোসেসের সন্ধান করছেন, আপনি প্রসেসরটি সুস্পষ্টভাবে সংজ্ঞায়িত করতে পারেন (অর্থাত্ পাইপপ্রসেসর.ডিফাইনগুলির মাধ্যমে) এবং উত্সের # নির্দিষ্ট বিবৃতি উপেক্ষা করতে এটি বলতে পারেন । এটি আপনার প্রকল্পের উত্স কোড ব্যবহার করতে পারেন এমন দুর্ঘটনাবশত দুর্ঘটনাক্রমে অপসারণ থেকে এড়ানো উচিত। এই কার্যকারিতাটি সেট করার জন্য বর্তমানে কোনও প্যারামিটার নেই তবে এটি যুক্ত করা তুচ্ছ হবে।

এখানে একটি তুচ্ছ উদাহরণ:

from pypreprocessor import pypreprocessor

# run the script in 'production' mode
if 'commercial' in sys.argv:
    pypreprocessor.defines.append('commercial')

if 'open' in sys.argv:
    pypreprocessor.defines.append('open')

pypreprocessor.removeMeta = True
pypreprocessor.parse()

তারপরে উত্স:

#ifdef commercial
// Copyright 2012 (C) Acme Technology, All Rights Reserved.
// Very large, often varied and restrictive copyright license in English and French,
// sometimes also embedded in make files and shell scripts with varied 
// comment styles.
#ifdef open
// GPL Copyright (C) Acme Technology Labs 2012, Some rights reserved.
// Acme appreciates your interest in its technology, please contact xyz@acme.com 
// for technical support, and www.acme.com/emergingTech for updates and RSS feed.
#endif

দ্রষ্টব্য: স্পষ্টতই, আপনাকে ইনপুট / আউটপুট ফাইলগুলি সেট করার জন্য একটি উপায় বাছাই করতে হবে তবে এটি খুব কঠিন হওয়া উচিত নয়।

প্রকাশ: আমি পাইপপ্রসেসরের মূল লেখক।


একদিকে: আমি প্রথমে এটিকে ভয়ঙ্কর পাইথন 2 কে / 3x রক্ষণাবেক্ষণ সমস্যার সমাধান হিসাবে লিখেছি। আমার পদ্ধতিটি ছিল, একই উত্স ফাইলে 2 এবং 3 বিকাশ করুন এবং প্রিপ্রসেসর নির্দেশিকা ব্যবহার করে পার্থক্যগুলি অন্তর্ভুক্ত / বাদ দিন। দুর্ভাগ্যক্রমে, আমি কঠিন পথটি আবিষ্কার করেছিলাম যে পাইথনে সত্যিকারের খাঁটি (অর্থাত্ সিটির প্রয়োজন নেই) প্রিপ্রোসেসরটি লেখা অসম্ভব কারণ লেক্সার প্রিপ্রসেসরটি চালানোর সুযোগ পাওয়ার আগে বেমানান কোডটিতে সিনট্যাক্স ত্রুটিগুলি ফ্ল্যাগ করে। যে কোনও উপায়ে, এটি এখনও আপনার সহ বিস্তৃত পরিস্থিতিতে দরকারী।


এই শিলা। আমরা যদি কিছু বাদ দিতে চাই না এমন কোডটি ছাড়াই এবং ফাইল ছাড়াই তিনটি উপায়ে ডিফের মতো কিছু না করতে পারি, তবে তাদের ডিফ নিয়েছি, তারপরে মূলটি থেকে পৃথক রেখাগুলি সরিয়ে নিয়েছি।
ডেভেলপারডন

@ ডেভেলপারডন ইয়েপ, এটি সাধারণ ধারণা। এটি পরিচালনা করার কয়েকটি ভিন্ন উপায় রয়েছে, এটি আপনি কীভাবে প্রতিশ্রুতি-প্রকাশের চক্রটি পরিচালনা করার পরিকল্পনা করছেন তার উপর নির্ভর করে। এই টুকরাটি কেবলমাত্র প্রচুর কাজ সরিয়ে দেয় যা অন্যথায় ক্লান্তিকর এবং / অথবা ত্রুটির প্রবণতা।
ইভান প্লেইস

1

সম্ভবত এটি ভাল ধারণা হবে

1. মন্তব্য ট্যাগগুলি যুক্ত করুন:

> // *COPYRIGHT-BEGIN-TAG*
> // Copyright 2012 (C) Acme Technology, All Rights Reserved.
> // Very large, often varied and restrictive copyright license in English and French,
> // sometimes also embedded in make files and shell scripts with varied 
> // comment styles. 
> // *COPYRIGHT-ENG-TAG*
>   ... Usual header stuff...
>
> void initTechnologyLibrary() {
>     nuiInterface(on);
> #ifdef  UNDER_RESEARCH
>     holographicVisualization(on);
> #endif
> }

2. ওপেন সোর্স রচয়িতা জন্য লিখুন স্ক্রিপ্ট সব ফাইল মধ্য দিয়ে যেতে এবং তাদের মধ্যে টেক্সট প্রতিস্থাপন কপিরাইট BEGIN-ট্যাগ এবং কপিরাইট-ইং-ট্যাগ ট্যাগ


1
আমার কি শুরুর ট্যাগ লাগবে? এখনও পর্যন্ত আমাদের সমস্ত উত্স ফাইলগুলি প্রথম সারির কপিরাইট দিয়ে শুরু হয় এবং আমাদের শেল স্ক্রিপ্টগুলি দ্বিতীয় লাইনের কপিরাইটের সাথে শুরু হয়। অনেকগুলি ফাইল রয়েছে, সুতরাং আমি খুব সামান্য পরিমাণে সম্পাদনা করতে চাই যা সম্ভব।
ডেভেলপারডন

আমি মনে করি কিছু ফাইল তাদের ফাংশন, প্যারামিটার এবং মান নামগুলি ফিরিয়ে আনতে ডক্সিজেন ব্যবহার করতে পারে। এই ফাইলগুলি ইতিমধ্যে সেভাবে সেটআপ করা হয়নি, আমরা যদি সেই দিকটি আরও গ্রহণ করে এমন কোনও পছন্দ করে নিই তবে এটি সত্যই সম্পাদনা হতে পারে।
ডেভেলপারডন

কমপক্ষে আপনাকে একবার এটি পরিবর্তন করতে হবে। যদি আপনার কপিরাইট নীতি পরিবর্তন হয় তবে আপনি এটি পরিচালনা করতে পারেন।
অ্যালেক্স হাশিমি

1

আমি আপনাকে আপনার কোডবেস রূপান্তর করার জন্য একটি সরঞ্জাম প্রদর্শন করতে যাচ্ছি না, প্রচুর উত্তর ইতিমধ্যে তা করেছে। বরং, এর জন্য শাখাগুলি কীভাবে পরিচালনা করতে হয় সে সম্পর্কে আমি আপনার মন্তব্যের জবাব দিচ্ছি।

আপনার 2 টি শাখা থাকা উচিত:

  • সম্প্রদায় (আসুন এটির মতো ওপেন সোর্স সংস্করণটি কল করুন)
  • পেশাদার (আসুন এইরকম বন্ধ উত্স সংস্করণটি কল করুন)

প্রিপ্রোসেসরগুলির অস্তিত্ব থাকা উচিত নয়। আপনার দুটি ভিন্ন সংস্করণ রয়েছে। এবং সামগ্রিকভাবে একটি ক্লিনার কোডবেস।

সমান্তরালে দুটি অনুলিপি রক্ষণ করতে আপনি ভয় পান? চিন্তা করবেন না, আপনি একীভূত করতে পারেন!

আপনি যদি সম্প্রদায় শাখায় পরিবর্তন করেন তবে কেবল তাদের পেশাদার শাখায় মার্জ করুন। গিট এটি সত্যিই পরিচালনা করে ।

এইভাবে, আপনি আপনার কোডবেসের 2 টি রক্ষণাবেক্ষণ অনুলিপি রাখুন। এবং ওপেন সোর্সের জন্য একটি প্রকাশ করা পাই হিসাবে সহজ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.